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)。

缺点:

  • 代码可能会变得复杂,因为引入许多新类。
  • 服务响应可能受到影响,因为添加了执行时间的延迟