创建文件Downloader.go
package template
import "fmt"
type Downloader interface {
    Download(url string)
}
type template struct {
    implement
    url string
}
type implement interface {
    download()
    save()
}
func NewTemplate(impl implement) *template {
    return &template{impl, ""}
}
func (t *template) Download(url string) {
    fmt.Println("模板下载start")
    t.url = url
    t.implement.download()
    t.implement.save()
    fmt.Println("模板下载end")
}
func (t *template) save() {
    fmt.Println("模板下载保存")
    t.implement.save()
}
创建文件HttpDown.go
package template
import "fmt"
type HttpDownload struct {
    *template
}
func NewHttpDownload() Downloader {
    downloader := &HttpDownload{}
    template := NewTemplate(downloader)
    downloader.template = template
    return downloader
}
func (hd *HttpDownload) download() {
    fmt.Printf("http down %s \n", hd.url)
}
func (hd *HttpDownload) save() {
    fmt.Printf("http save \n")
}
创建文件FtpDown.go
package template
import "fmt"
type FtpDownload struct {
    *template
}
func NewFtpDownload() Downloader {
    downloader := &FtpDownload{}
    template := NewTemplate(downloader)
    downloader.template = template
    return downloader
}
func (fd *FtpDownload) download() {
    fmt.Printf("ftp down %s \n", fd.url)
}
func (fd *FtpDownload) save() {
    fmt.Printf("ftp save \n")
}
main.go
package main
import "ssp_api_go/test/design/template"
func main() {
    var downloader template.Downloader = template.NewHttpDownload()
    downloader.Download("https://ijackey.com")
    var downloader2 template.Downloader = template.NewFtpDownload()
    downloader2.Download("https://ijackey.com")
}