结构型设计模式—代理模式
2023-12-31 11:00:17
代理模式:进行逻辑处理的原对象通常被称作服务对象,代理跟服务对象实现相同的接口,控制原对象的访问,并允许在将请求提交原对象前后进行处理,从而增强原对象的逻辑处理。
汽车的 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 方法,并在之前添加年龄检查行为,从而达到想要的效果。
整体结构:与代理模式的一共有四种角色:客户端、服务接口、服务类和代理类
- 服务接口 (Ser-vice Inter-face) 声明了服务类要实现的接口。 服务类的业务处理逻辑就是实现在这里定义的接口方法中,代理类也必须遵循该接口才能伪装成服务对象。
- 服务 (Ser-vice) 类,就是提供实际业务逻辑的原对象。
- 代理 (Proxy) 类包含一个服务对象作为成员变量。 代理完成其任务 (例如延迟初始化、记录日志、 访问控制和缓存等)后面会将请求传递给服务对象。通常情况下, 代理会对其服务对象的整个生命周期进行管理,来增强服务对象,这样与核心业务逻辑不相关的增强逻辑就可以由代理来实现。
- 客户端 (Client) 通过统一接口与服务或代理进行交互, 所以可在一切需要服务对象的代码中使用服务对象的代理,客户端完全不会感知到。
若对代理再代理,就是装饰器模式。
参考公众号:网管叨bi叨
文章来源:https://blog.csdn.net/zhaicheng55/article/details/135313327
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!