golang设计模式--代理模式

117 阅读2分钟

创建型模式 : 就是专门用来拿到实例化对象的
代理模式是一种结构型模式,强调的是结构,不同于创建型模式

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()

}