0
点赞
收藏
分享

微信扫一扫

7 代理模式 -- go语言设计模式

Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。

​ 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。

项目的准备工作

1.找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

1.png

2.在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.png

3.解决运行错误

GO111MODULE=""		//如果是这样,运行会报错
错误: package design/factory_met/module/factory is not in GOROOT

GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。

// 将GO111MODULE修改为off,在终端输入go env -w GO111MODULE=off

4.为项目创建文件夹

//	在项目文件夹 proxy_case 里创建新文件夹

//	proxy	-- 存放代理的全部文件

3.png

代理模式的实现代码

1.接口文件 -- proxy文件夹

文件1 -- shopping.go

package proxy

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

2.结构体文件 -- proxy文件夹

1.商品

1-商品 -- goods.go

package proxy

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

2.购物主题

1-韩国购物 -- koreashopping.go

package proxy

import "fmt"

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

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

2-美国购物 -- americanshopping.go

package proxy

import "fmt"

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

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

3-非洲购物 -- africashopping.go

package proxy

import "fmt"

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

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

3.海外的代理 -- proxy文件夹

1-海外的代理 -- overseasproxy.go

package proxy

import "fmt"

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

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

//创建一个代理,并且配置关联被代理的主题
func NewProxy(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,"] 进行了海关检查, 成功的带回祖国")
}

3.主文件 -- main.go 在项目文件夹

package main

import (
	"design/proxy_case/proxy"
	"fmt"
)

// 具体工作
func main() {
	g1 := proxy.Goods{
		Kind: "韩国面膜",
		Fact: true,
	}

	g2 := proxy.Goods{
		Kind: "高丽人参",
		Fact: false,
	}

	//如果不使用代理来完成从韩国购买任务
	var shopping proxy.Shopping
	shopping = new(proxy.KoreaShopping) //具体的购买主题

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

	fmt.Println("---------------以下是 使用 代理模式-------")
	var overseasProxy proxy.Shopping
	overseasProxy = proxy.NewProxy(shopping)
	overseasProxy.Buy(&g1)
	overseasProxy.Buy(&g2)

}

终端输出

4.png

4.全部文件图

5.png

举报

相关推荐

0 条评论