golang 代理模式

80 阅读1分钟

我们知道在面向对象的世界中,万物都是对象,代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

通俗来讲,代理模式就是我们生活中的中介。比如,有个舔狗喜欢一个女孩,但是他不敢表白,他就叫另外一个工具人去表白,

代理模式有如下好处

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