简介
代理模式为一个对象提供一种代理以控制对该对象的访问,它是一个使用率非常高的设计模式,即使在现实生活中,也是很常见,比如演唱会门票黄牛。假设你需要看一场演唱会,但是官网上门票已经售罄,于是就当天到现场通过黄牛高价买了一张。在这个例子中,黄牛就相当于演唱会门票的代理,在正式渠道无法购买门票的情况下,你通过代理完成了该目标。
从演唱会门票的例子我们也可以看出,使用代理模式的关键在于当Client不方便直接访问一个对象时,提供一个代理对象控制该对象的访问。Client实际上访问的是代理对象,代理对象会将Client的请求转给本体对象去处理。
作用
通过代理对象来增强目标对象的功能。利用的是AOP横切的思想。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| package main
import "fmt"
type Goods struct { Kind string Fact bool } type Shopping interface { Buy(goods *Goods) }
type OverseasProxy struct { shopping Shopping }
func (op *OverseasProxy) Buy(goods *Goods) { if op.distinguish(goods) { op.shopping.Buy(goods) op.check(goods) } }
func (op *OverseasProxy) distinguish(goods *Goods) bool { fmt.Println("对[", goods.Kind, "]进行了辨别真伪.") if !goods.Fact { fmt.Println("发现假货", goods.Kind, ", 不应该购买。") } return goods.Fact }
func (op *OverseasProxy) check(goods *Goods) { fmt.Println("对[", goods.Kind, "] 进行了海关检查, 成功的带回祖国") }
func NewProxy(shopping Shopping) Shopping { return &OverseasProxy{shopping} }
type KoreaShopping struct{}
func (ks *KoreaShopping) Buy(goods *Goods) { fmt.Println("去韩国进行了购物, 买了 ", goods.Kind) }
type AmericanShopping struct{}
func (as *AmericanShopping) Buy(goods *Goods) { fmt.Println("去美国进行了购物, 买了 ", goods.Kind) } func main() { g1 := Goods{ Kind: "韩国面膜", Fact: true, }
g2 := Goods{ Kind: "CET4证书", Fact: false, }
shopping := &KoreaShopping{} overseasProxy := NewProxy(shopping) overseasProxy.Buy(&g1) overseasProxy.Buy(&g2) }
|