表述 (结构型模式)
为其他对象(A)提供一种代理对象(B),并由改代理对象(B)控制对该对象(A)的访问
在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务
代理模式类图
代理模式类图
- Subject(协议):定义代理和委托的共同方法
- RealSubject(真实角色):根据指定的协议,委托代理去完成实现指定方法
- Proxy(代理角色):根据指定的协议,实现委托需要实现的方法
优点
- 具有良好的扩展性。委托的业务逻辑可能会随时改变,当有新增功能,只需要在协议中增加方法就能不影响原有功能的情况下增加新功能
- 有利于代码的封装。如果一个类,实现了某个协议,那么这个协议中的属性或方法就不必公有化,就可以被定义协议的类调用。这样可以减少一个类暴露给外部的方法
- 有利于程序的结构化与层次化。一个协议往往是解决某一个问题,对于一个其他的不过却类似的问题,我们只用再次实现协议即可,避免了自己再次构思一组方法,提高代码的复用性
示例
需求V1 :不想做饭,想用APP点个外卖
协议类
代码语言:javascript复制protocol DoSomethingDelegate {
func buySomething()
}
委托类
代码语言:javascript复制class Person {
weak var delegate : APP?
func buy() {
if self.delegate != nil && ((self.delegate?.buySomething) != nil) {
self.delegate?.buySomething()
}
}
}
代理类
代码语言:javascript复制class APP :DoSomethingDelegate{
func buySomething() {
print("外卖")
}
}
客户端调用
代码语言:javascript复制let per = Person.init()
let app = APP.init()
per.delegate = app
per.buy()
log:
//外卖