我们知道在面向对象的世界中,万物都是对象,代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
通俗来讲,代理模式就是我们生活中的中介。比如,有个舔狗喜欢一个女孩,但是他不敢表白,他就叫另外一个工具人去表白,
代理模式有如下好处
1、 通过引入代理对象来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
2、 通过代理对象对访问进行控制
当然,代理模式也是有缺点的:
1、代理模式会造成系统设计中类的数量增加。
2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
3、增加了系统的复杂度。
其实golang的代理模式,也是用继承来实现,类似java,不过go没有继承,通过结构体嵌套的方式代理,代码如下:
package main
import "fmt"
type Girl struct {
Name string
}
// Dog 舔狗
type Dog struct {
Name string
}
// SendMsg 真实对象的发送动作
func (p *Dog) SendMsg(g Girl) {
fmt.Printf("[%s], 这是[%s]给你的情书\n", g.Name, p.Name)
}
// Proxy 代理对象
type Proxy struct {
Name string
Dog
}
// Wrap 代理对象对真实对象进行包装
func (p *Proxy) Wrap(t Dog) {
p.Dog = t
}
// SendMsg 工具人的发送动作
func (p *Proxy) SendMsg(g Girl) {
p.Dog.SendMsg(g) // 调用真实对象的方法
fmt.Printf("——来自[%v]\n", p.Name)
}
func main() {
girl := Girl{"小红"}
Dog := Dog{"舔狗"}
proxy := Proxy{Name: "工具人"}
proxy.Wrap(Dog)
proxy.SendMsg(girl)
}