设计模式-桥接模式

桥接模式的定义,就是将类的抽象部分和它具体的实现部分,进行按需分离,让他们可以进行独立的,有选择的变化,然后通过组合,建立起两个类直接的联系。

优点

  • 将一个复杂的类分离出抽象部分和实现部分两个维度,完成了代码的解耦,提高了系统的扩展性。
  • 扩展时只需要新增类,无需修改源代码,符合开闭原则。
  • 通过组合而不是继承来实现耦合,符合合成复用原则。

缺点

  • 增加了系统的理解难度和设计难度(这也算是大部分设计模式的共性)。
  • 需要正确识别系统中各个独立变化的维度。
protocol TV { func on() func off() func tuneChannel(channel: Int) } /// 海尔电视 class Haier : TV { func on() { print("Haier on") } func off() { print("Haier off") } func tuneChannel(channel: Int) { print("Haier 切换到 \(channel) 频道") } } /// 康佳电视 class KONKA : TV { func on() { print("KONKA on") } func off() { print("KONKA off") } func tuneChannel(channel: Int) { print("KONKA 切换到 \(channel) 频道") } } protocol RemoteControl { var tv: TV{get set} func on() func off() func setChannel(channel: Int) } extension RemoteControl { func on() { tv.on() } func off() { tv.off() } func setChannel(channel: Int) { tv.tuneChannel(channel: channel) } } /// 万能遥控器 class ConcreteRemote : RemoteControl { var tv: TV var channel: Int init(tv: TV, channel: Int = 0) { self.tv = tv self.channel = channel } func nextChannel() { self.channel += 1 setChannel(channel: channel) } func previousChannel() { self.channel -= 1 setChannel(channel: channel) } } let haierRemote = ConcreteRemote(tv: Haier()) haierRemote.on() haierRemote.nextChannel() haierRemote.off() print("\n") let konkaRemove = ConcreteRemote(tv: KONKA(), channel: 3) konkaRemove.on() konkaRemove.previousChannel() konkaRemove.off()