意圖
將一個大類或一系列緊密相關(guān)的類拆分為抽象和實現(xiàn)兩個獨立的層次結(jié)構(gòu), 從而能在開發(fā)時分別使用。
問題
有一個幾何形狀Shape類,從它能擴(kuò)展出兩個子類: 圓形Circle和方形Square 。 希望對這樣的類層次結(jié)構(gòu)進(jìn)行擴(kuò)展以使其包含顏色,所以你打算創(chuàng)建名為紅色Red和藍(lán)色Blue的形狀子類。但是由于你已有兩個子類,所以總共需要創(chuàng)建四個類才能覆蓋所有組合,例如藍(lán)色圓形Blue-Circle和紅色方形Red-Square。
而且在層次結(jié)構(gòu)中新增形狀和顏色將導(dǎo)致代碼復(fù)雜程度指數(shù)增長。例如添加三角形狀,你需要新增兩個子類,也就是每種顏色一個;此后新增一種新顏色需要新增三個子類,即每種形狀一個。如此以往,情況會越來越糟糕。
解決方案
橋接模式通過將繼承改為組合的方式來解決這個問題。具體來說,就是抽取其中一個維度并使之成為獨立的類層次,這樣就可以在初始類中引用這個新層次的對象,從而使得一個類不必?fù)碛兴械臓顟B(tài)和行為。
在形狀類中添加一個顏色類的成員變量,形狀類可以將所有與顏色相關(guān)的工作委派給連入的顏色對象。 這個成員變量就成為了形狀和顏色之間的橋梁,新增顏色將不再需要修改形狀類層次。
橋接模式結(jié)構(gòu)
在實際的程序中,抽象部分是圖形用戶界面(GUI),而實現(xiàn)部分則是底層操作系統(tǒng)代碼(API),GUI 層調(diào)用API層來對用戶的各種操作做出響應(yīng)。
一般來說, 可以在兩個獨立方向上擴(kuò)展這種應(yīng)用:
- 開發(fā)多個不同的 GUI(例如面向普通用戶和管理員進(jìn)行分別配置)
- 支持多個不同的 API(例如, 能夠在 Windows、 Linux 和 macOS 上運行該程序)。
用橋接模式將類拆分為兩個類層次結(jié)構(gòu):
- 抽象部分: 程序的 GUI 層。
- 實現(xiàn)部分: 操作系統(tǒng)的 API。
這樣做的好處是:無需改動與 API 相關(guān)的類就可以修改 GUI 類。此外如果想支持一個新的操作系統(tǒng), 只需在實現(xiàn)部分層次中創(chuàng)建一個子類即可。
小結(jié)
適合應(yīng)用場景:
- 要拆分或重組一個具有多重功能的龐雜類。
- 希望在幾個獨立維度上擴(kuò)展一個類。
- 需要在運行時切換不同實現(xiàn)方法。
優(yōu)點:
- 開閉原則,可以新增抽象部分和實現(xiàn)部分,且它們之間不會相互影響。
- 單一職責(zé)原則,抽象部分專注于處理高層邏輯,實現(xiàn)部分處理平臺細(xì)節(jié)。
- 可以創(chuàng)建與平臺無關(guān)的類和程序。
- 客戶端代碼僅與高層抽象部分進(jìn)行互動,不會接觸到平臺的詳細(xì)信息。
缺點:
- 對高內(nèi)聚的類使用該模式可能會讓代碼更加復(fù)雜。
參考
22種設(shè)計模式:refactoringguru.cn/design-patterns
《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》