Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
项目的准备工作
1.找到 go 的 GOPATH
$ go env //可以查看 GOPATH
2.在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
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 -- 存放代理的全部文件
代理模式的实现代码
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)
}