创建型模式 : 就是专门用来拿到实例化对象的
代理模式是一种结构型模式,强调的是结构,不同于创建型模式
type task interface {
doHomeWork()
}
type zhangSan struct{}
func (z *zhangSan) doHomeWork() {
fmt.Println("张三的作业")
}
type liSi struct{}
func (l *liSi) doHomeWork() {
fmt.Println("李四的作业")
}
type wangWu struct{}
func (w *wangWu) doHomeWork() {
fmt.Println("王五的作业")
}
假设张三,李四,王五,都需要写作业,但是作业这种东西谁愿意写啊
所以就出现写一种写手的人,专门帮忙写作业,并且提供解答等服务
于是就有了新的写手结构体,那这个结构体就是代理结构体
type writer struct {
t task //这里就体现了代理模式的思想,就相当于在说,写手有了写作业的功能
//task本身就是引用类型了,所以不写成 t *task
}
// 于是就有了写手写作业的事情出现了
func (w *writer) doHomeWork() {
fmt.Println("写手开始代写作业")
w.t.doHomeWork()
w.answerQuestion()
}
// 甚至于写手还会提供答疑
func (w *writer) answerQuestion() {
fmt.Println("写手开始答疑")
w.t.doHomeWork()
}
不难发现,出现的代理结构体不仅可以写作业,而且还可以疯狂加其他的功能
并且由于代理结构体组合了写作业的功能,所以可以在写作业后,干其他新的事情
完整的代理模式代码
package main
import "fmt"
type task interface {
doHomeWork()
}
type zhangSan struct{}
func (z *zhangSan) doHomeWork() {
fmt.Println("张三的作业")
}
type liSi struct{}
func (l *liSi) doHomeWork() {
fmt.Println("李四的作业")
}
type wangWu struct{}
func (w *wangWu) doHomeWork() {
fmt.Println("王五的作业")
}
type writer struct {
t task //这里就体现了代理模式的思想,就相当于在说,写手有了写作业的功能
//task本身就是引用类型了,所以不写成 t *task
}
// 于是就有了写手写作业的事情出现了
func (w *writer) doHomeWork() {
fmt.Println("写手开始代写作业")
w.t.doHomeWork()
w.answerQuestion()
}
// 甚至于写手还会提供答疑
func (w *writer) answerQuestion() {
fmt.Println("写手开始答疑")
w.t.doHomeWork()
}
func newClient(t task) task {
return &writer{t}
}
func main() {
z := &zhangSan{}
c := newClient(z)
c.doHomeWork()
}