1. Proxy Pattern what? how?
代理模式是一种结构模式,其目的是提供对象的代理或中介来控制对象的访问。通常包装对象以隐藏其某些特征。下面举一个汽车的代理,Driven接口,Car和CarProxy都实现了,但是通过代理可以实现特殊逻辑的植入,如开车司机并限制司机的年龄等;
package main
import "fmt"
type Driven interface {
Drive()
}
type Car struct {}
func (c *Car) Drive(){
fmt.Println("Car being driven")
}
type Driver struct {
Age int
}
type CarProxy struct {
car Car
driver *Driver
}
func (c *CarProxy) Drive(){
if c.driver.Age >= 18 {
c.car.Drive()
}else{
fmt.Println("Driver too young!!!")
}
}
func NewCarProxy(driver *Driver) *CarProxy {
return &CarProxy{Car{}, driver}
}
func main(){
car := NewCarProxy(&Driver{20})
car.Drive()
}
output:
Car being driven
2. 代理模式和其他模式的关系:
-
门面模式和代理模式是相似的,因为在两者都可以缓冲复杂的实体,并初始化它自己。
-
Adapter 模式为包装对象提供了一个不同的接口,而代理模式提供了相同的接口,修饰模式(Decorator Pattern)提供了一个增强的接口。
3. 优点和缺点
优点:
- 允许在客户端不知道的情况下控制服务对象(main struct)。
- 允许在客户端不关心的情况下管理服务对象的生命周期。
- 即使服务对象尚未准备好或尚未可用,代理也可以工作。
- 帮助实施开闭原则(open-close)。
缺点:
- 代码可能会变得复杂,因为引入许多新类。
- 服务响应可能受到影响,因为添加了执行时间的延迟