橋接模式
- 橋接模式的目的是把抽象層次結(jié)構(gòu)從其實(shí)現(xiàn)中分離出來,使其能夠獨(dú)立變更乘碑。
- 抽象層定義了供客戶端使用的上層的抽象接口挖息。實(shí)現(xiàn)層次結(jié)構(gòu)定義了抽象層次使用的底層接口。
- 實(shí)現(xiàn)類的引用被封裝于抽象層的實(shí)例中兽肤,橋接就形成了套腹。
適用性
- 不想在抽象與其實(shí)現(xiàn)之間形成固定的綁定關(guān)系(這樣就能在運(yùn)行時(shí)切換實(shí)現(xiàn))
- 抽象及其實(shí)現(xiàn)都應(yīng)可以通過子類化獨(dú)立進(jìn)行擴(kuò)展
- 對抽象的實(shí)現(xiàn)進(jìn)行修改不應(yīng)影響客戶端代碼
- 如果每個(gè)實(shí)現(xiàn)需要額外的子類以細(xì)化抽象绪抛,則說明有必要把它們分成兩個(gè)部分
- 想在帶有不同抽象接口的多個(gè)對象之間共享一個(gè)實(shí)現(xiàn)
橋接模式的優(yōu)點(diǎn):
- 橋接模式使用聚合關(guān)系,解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系电禀,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來變化
- 提高了系統(tǒng)的可擴(kuò)展性幢码,可以獨(dú)立地對抽象部分和實(shí)現(xiàn)部分進(jìn)行擴(kuò)展
- 可減少子類的個(gè)數(shù),這個(gè)在前面講手機(jī)示例的時(shí)候進(jìn)行分析了
- 實(shí)現(xiàn)細(xì)節(jié)對客戶透明尖飞,可以對用戶隱藏實(shí)現(xiàn)細(xì)節(jié)
橋接模式的缺點(diǎn):
- 橋接模式的引入會增加系統(tǒng)的理解與設(shè)計(jì)難度症副,由于聚合關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)與編程
- 橋接模式要求正確識別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度政基,因此其使用范圍具有一定的局限性
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()
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者