【Golang设计模式】3.代理模式

3. 代理模式

代理模式,为其它对象提供一种代理以控制对这个对象的访问。

比如小明向小红写情书,但是又不好意思直接给小红,于是就让小军替自己给小红。

在路径proxy\下新建文件proxy.go,包名为proxy

package proxy

// ...

定义小红和发送消息的接口:

type Girl struct {
	Name string
}

// 发送消息的接口
type SendMsger interface {
	SendMsg(*Girl)
}

定义真实对象和真实对象的发送方法:

// 真实对象
type TrueLove struct {
	Name string
}

// 真实对象的发送动作
func (p *TrueLove) SendMsg(g Girl) {
	fmt.Printf("[%s], 这是[%s]给你的情书\n", g.Name, p.Name)
}

定义代理对象、代理对象对真实对象的包装和代理对象的发送方法:

// 代理对象
type Proxy struct {
	Name string
	TrueLove
}

// 代理对象对真实对象进行包装
func (p *Proxy) Wrap(t TrueLove) {
	p.TrueLove = t
}

// 代理对象的发送动作
func (p *Proxy) SendMsg(g Girl) {
	p.TrueLove.SendMsg(g) // 调用真实对象的方法
	fmt.Printf("——来自[%v]\n", p.Name)
}

在路径proxy的同级目录下新建main.go用于测试方法:

package main

import (
	"fmt"
	"github.com/loveshes/go-design-patterns/pattern/proxy-pattern/proxy"
)

func main() {
	girl := proxy.Girl{"小红"}
	trueLove := proxy.TrueLove{"小明"}
	trueLove.SendMsg(girl)
	fmt.Println()

	proxy := proxy.Proxy{Name: "工具人小军"}
	proxy.Wrap(trueLove)
	proxy.SendMsg(girl)
}

输出为

[小红], 这是[小明]给你的情书

[小红], 这是[小明]给你的情书
——来自[工具人小军]

完整示例

posted @ 2020-04-19 23:18  爱Code的王饱饱  阅读(561)  评论(0编辑  收藏  举报