
代理模式是一种结构模式,其目的是提供对象的代理或中介来控制对象的访问。通常包装对象以隐藏其某些特征。下面举一个汽车的代理,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
门面模式和代理模式是相似的,因为在两者都可以缓冲复杂的实体,并初始化它自己。
Adapter 模式为包装对象提供了一个不同的接口,而代理模式提供了相同的接口,修饰模式(Decorator Pattern)提供了一个增强的接口。

优点:
缺点: