# 代理模式

> 此开源图书由[ithaiq](https://github.com/ithaiq)原创，创作不易转载请注明出处

该模式和装饰器模式很像，但语义不一样。代理模式是控制函数执行的前置和后置条件，而装饰器模式着重在于突出扩展功能

```go
type Subject interface {
	Do()
}

type RealSubject struct{}

func (impl RealSubject) Do() {
	fmt.Println("do something")
}

// SubjectProxy 静态代理类
type SubjectProxy struct {
	subject RealSubject
}

// Do 也实现了Subject接口
func (proxy SubjectProxy) Do() {
	// 前置触发,一般会是一些条件控制什么的
	fmt.Println("proxy before")
	proxy.subject.Do()
	// 后置触发
	fmt.Println("proxy after")
}

func NewProxySubject() Subject {
	return new(SubjectProxy)
}
```
