代理模式:进行逻辑处理的原对象通常被称作服务对象,代理跟服务对象实现相同的接口,控制原对象的访问,并允许在将请求提交原对象前后进行处理,从而增强原对象的逻辑处理。
汽车的 Car 类型
type Car struct{}
Car 需要实现一个代表驾驶行为的接口(interface)Vehicle,该接口只有一个方法Drive()
type Vehicle interface {
Drive()
}
type Car struct{}
func (c *Car) Drive() {
fmt.Println("Car is being driven")
}
Car 的结构体指针通过实现Drive()
方法实现了Vehicle
接口,如果开车还有个条件是驾驶员满足18岁,给Car
结构体加一个Age
字段显然是不合理的。这是车龄而不是驾驶员年龄。采用加一个表示驾驶员的类型 Driver
,再一个包装 Driver 和 Vehicle 类型的包装类型。
type Driver struct {
Age int
}
type CarProxy struct {
vehicle Vehicle
driver *Driver
}
func NewCarProxy(driver *Driver) *CarProxy {
return &CarProxy{&Car{}, driver}
}
用包装类型代理vehicle
属性的 Drive()
行为时,加上驾驶员的年龄限制。
func (c *CarProxy) Drive() {
if c.driver.Age >= 16 {
c.vehicle.Drive()
} else {
fmt.Println("Driver too young!")
}
}
不为服务对象 – Car 类型添加任何属性和方法。相反,在其上面的代理层把客户端 Drive()
方法的调用委托(英文术语叫delegate)给其 vehicle 属性的 Drive 方法,并在之前添加年龄检查行为,从而达到想要的效果。
整体结构:与代理模式的一共有四种角色:客户端、服务接口、服务类和代理类
若对代理再代理,就是装饰器模式。
参考公众号:网管叨bi叨