05-Go设计模式-代理模式

代理模式

示例代码
/*
代理模式: 可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问

subject(抽象主题角色):真实主题与代理主题的共同接口。
RealSubject(真实主题角色):定义了代理角色所代表的真实对象。
Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真是主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象
*/

package _0_proxy

import "fmt"

type Goods struct {
	Kind string //商品种类
	Fact bool   //商品真伪
}

//========================= 抽象层 ===================================
//抽象的购物主题Subject
type Shopping interface {
	Buy(goods *Goods) //某任务
}

//======================== 实现层 ====================================
//具体的购物主题,实现了shopping,去韩国购物
type KoreaShopping struct {
}

func (ks *KoreaShopping) Buy(goods *Goods) {
	fmt.Println("去韩国进行了购物,买了", goods.Kind)
}

//具体的购物主题,实现了shopping,去美国购物
type AmericanShopping struct {
}

func (as *AmericanShopping) Buy(goods *Goods) {
	fmt.Println("去美国进行了购物,买了", goods.Kind)
}

//具体的购物主题,实现了shopping,去非洲购物
type AfrikaShopping struct {
}

func (as *AfrikaShopping) Buy(goods *Goods) {
	fmt.Println("去非洲进行了购物,买了", goods.Kind)
}

//海外的代理
type OverseasProxy struct {
	shopping Shopping //代理某个主题,这里是抽象类型
}

func (op *OverseasProxy) Buy(goods *Goods) {
	//1. 先验货
	if op.distinguish(goods) == true {
		//2. 进行购买
		op.shopping.Buy(goods) //调用原被代理的具体主题任务
		//海关安检
		op.check(goods)
	}
}

//创建一个代理,并且配置关联被代理的主题
func NewPorxy(shopping Shopping) Shopping {
	return &OverseasProxy{
		shopping,
	}
}

//验货流程
func (op *OverseasProxy) distinguish(goods *Goods) bool {
	fmt.Println("对[", goods.Kind, "]进行了辨别真伪。")
	if goods.Fact == false {
		fmt.Println("发现假货", goods.Kind, ", 不应该购买。")
	}

	return goods.Fact
}

//安检流程
func (op *OverseasProxy) check(goods *Goods) {
	fmt.Println("对[", goods.Kind, "] 进行了海关检查, 成功的带回祖国")
}

测试代码
package _0_proxy

import (
	"fmt"
	"testing"
)

func TestKoreaShopping(t *testing.T) {
	g := Goods{
		Kind: "韩国面膜",
		Fact: true,
	}

	shopping := new(KoreaShopping)
	//===================== 不使用代理模式 ==================================
	//1-先验货
	if g.Fact == true {
		fmt.Println("对[", g.Kind, "]进行了辨别真伪.")
		//2-去韩国购买
		shopping.Buy(&g)
		//3-海关安检
		fmt.Println("对[", g.Kind, "] 进行了海关检查, 成功的带回祖国")
	}

	//================== 使用代理模式 ======================================
	fmt.Println("---------------------------")
	oerseasProxy := NewPorxy(shopping)
	oerseasProxy.Buy(&g)
}
posted @ 2022-10-08 11:13  李成果  阅读(55)  评论(0编辑  收藏  举报