简介

代理模式为一个对象提供一种代理以控制对该对象的访问,它是一个使用率非常高的设计模式,即使在现实生活中,也是很常见,比如演唱会门票黄牛。假设你需要看一场演唱会,但是官网上门票已经售罄,于是就当天到现场通过黄牛高价买了一张。在这个例子中,黄牛就相当于演唱会门票的代理,在正式渠道无法购买门票的情况下,你通过代理完成了该目标。

从演唱会门票的例子我们也可以看出,使用代理模式的关键在于当Client不方便直接访问一个对象时,提供一个代理对象控制该对象的访问。Client实际上访问的是代理对象,代理对象会将Client的请求转给本体对象去处理。

作用

通过代理对象来增强目标对象的功能。利用的是AOP横切的思想。

代码

img

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) {
// 1. 先验货
if op.distinguish(goods) {
//2. 进行购买
op.shopping.Buy(goods) //调用原被代理的具体主题任务
//3 海关安检
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)
}