结构型设计模式—代理模式

本文介绍了代理模式如何通过创建代理类来控制服务对象的访问,实现代理与服务接口的统一,以及在Car类型中应用代理模式,避免直接添加无关属性。同时提到代理模式下的四种角色:客户端、服务接口、服务类和代理类。装饰器模式在此背景下也被提及为更深层次的应用。
摘要由CSDN通过智能技术生成

代理模式:进行逻辑处理的原对象通常被称作服务对象,代理跟服务对象实现相同的接口,控制原对象的访问,并允许在将请求提交原对象前后进行处理,从而增强原对象的逻辑处理。

汽车的 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 方法,并在之前添加年龄检查行为,从而达到想要的效果。

整体结构:与代理模式的一共有四种角色:客户端、服务接口、服务类和代理类

  1. 服务接口 (Ser­vice Inter­face) 声明了服务类要实现的接口。 服务类的业务处理逻辑就是实现在这里定义的接口方法中,代理类也必须遵循该接口才能伪装成服务对象。
  2. 服务 (Ser­vice) 类,就是提供实际业务逻辑的原对象。
  3. 代理 (Proxy) 类包含一个服务对象作为成员变量。 代理完成其任务 (例如延迟初始化、记录日志、 访问控制和缓存等)后面会将请求传递给服务对象。通常情况下, 代理会对其服务对象的整个生命周期进行管理,来增强服务对象,这样与核心业务逻辑不相关的增强逻辑就可以由代理来实现
  4. 客户端 (Client) 通过统一接口与服务或代理进行交互, 所以可在一切需要服务对象的代码中使用服务对象的代理,客户端完全不会感知到。

若对代理再代理,就是装饰器模式。
参考公众号:网管叨bi叨

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值