持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
前言
在面向对象的开发过程中,其实咱们或多或少的都接触过一些设计模式,可能知道或不知道其对应的名称,也不知道其具体使用场景,今天咱们就来说说几种常见的设计模式,帮助你们在开发过程中,更加得心应手。
正文
代理模式
这里的代理模式和iOS中的代理其实关系不大,这里所说的代理模式,指的是将复杂的业务通过代理封装起来,调用方需通过代理才能拿到自己想要的结果。
例子:信用卡是银行账户的代理, 银行账户则是一大捆现金的代理。 它们都实现了同样的接口, 均可用于进行支付。 消费者会非常满意, 因为不必随身携带大量现金; 商店老板同样会十分高兴, 因为交易收入能以电子化的方式进入商店的银行账户中, 无需担心存款时出现现金丢失或被抢劫的情况。
代理模式有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你就可以无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。
咱们来通过一个租房和中介的例子说明一下
首先定义一个租房接口
protocol IRentHouse {
func rentHouse()
}
然后,定义一个RentHouse类,继承自IRentHouse,输出租房结果
class RentHouse: IRentHouse {
func rentHouse() {
print("租了一间房子...")
}
}
然后来定义代理中介,在中介里,定义了一个方法,如果想要租房子,就需要执行交中介费->租房->中介负责维修管理的流程
/// 中介
class IntermediaryProxy: IRentHouse {
private var rHouse: IRentHouse
init(rentHouse: IRentHouse) {
self.rHouse = rentHouse
}
func rentHouse() {
print("交中介费")
rHouse.rentHouse()
print("中介负责维修管理")
}
}
let rentHouse: IRentHouse = RentHouse()
let intermediary = IntermediaryProxy(rentHouse: rentHouse)
intermediary.rentHouse()
咱们来看输出
交中介费
租了一间房子...
中介负责维修管理
结语
代理模式优点
- 可以在客户端毫无察觉的情况下控制服务对象。
- 如果客户端对服务对象的生命周期没有特殊要求, 你可以对生命周期进行管理。
- 开闭原则。 你可以在不对服务或客户端做出修改的情况下创建新代理。
代理模式缺点
- 代码可能会变得复杂, 因为需要新建许多类。
- 服务响应可能会延迟。
扩展阅读 下面还有其他模式