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

发布时间:2023年12月31日

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

汽车的 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叨

文章来源:https://blog.csdn.net/zhaicheng55/article/details/135313327
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。