桥接模式
- 桥接模式的目的是把抽象层次结构从其实现中分离出来,使其能够独立变更。
- 抽象层定义了供客户端使用的上层的抽象接口。实现层次结构定义了抽象层次使用的底层接口。
- 实现类的引用被封装于抽象层的实例中,桥接就形成了。
适用性
- 不想在抽象与其实现之间形成固定的绑定关系(这样就能在运行时切换实现)
- 抽象及其实现都应可以通过子类化独立进行扩展
- 对抽象的实现进行修改不应影响客户端代码
- 如果每个实现需要额外的子类以细化抽象,则说明有必要把它们分成两个部分
- 想在带有不同抽象接口的多个对象之间共享一个实现
桥接模式的优点:
- 桥接模式使用聚合关系,解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化
- 提高了系统的可扩展性,可以独立地对抽象部分和实现部分进行扩展
- 可减少子类的个数,这个在前面讲手机示例的时候进行分析了
- 实现细节对客户透明,可以对用户隐藏实现细节
桥接模式的缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计与编程
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性
Example
protocol Switch {
var appliance: Appliance {get set}
func turnOn()
}
protocol Appliance {
func run()
}
class RemoteControl: Switch {
var appliance: Appliance
func turnOn() {
self.appliance.run()
}
init(appliance: Appliance) {
self.appliance = appliance
}
}
class TV: Appliance {
func run() {
print("tv turned on");
}
}
class VacuumCleaner: Appliance {
func run() {
print("vacuum cleaner turned on")
}
}
var tvRemoteControl = RemoteControl(appliance: TV())
tvRemoteControl.turnOn()
var fancyVacuumCleanerRemoteControl = RemoteControl(appliance: VacuumCleaner())
fancyVacuumCleanerRemoteControl.turnOn()
网友评论