桥接模式的定义,就是将类的抽象部分和它具体的实现部分,进行按需分离,让他们可以进行独立的,有选择的变化,然后通过组合,建立起两个类直接的联系。
优点
- 将一个复杂的类分离出抽象部分和实现部分两个维度,完成了代码的解耦,提高了系统的扩展性。
- 扩展时只需要新增类,无需修改源代码,符合开闭原则。
- 通过组合而不是继承来实现耦合,符合合成复用原则。
缺点
- 增加了系统的理解难度和设计难度(这也算是大部分设计模式的共性)。
- 需要正确识别系统中各个独立变化的维度。
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()