🎯 什麼情境該想到我
當你「發現有兩個各自會變化的維度(例如『圖形形狀』和『用哪套繪圖 API』、『遙控器種類』和『控制哪台裝置』),若用繼承硬把兩者綁在一起,子類別會像乘法一樣暴增」的時候。
⚙️ 怎麼用(步驟 / 公式)
意圖:把抽象部分與它的實作部分分離,讓兩者可以各自獨立地變化。
主要參與者 / 結構:
- Abstraction(抽象):定義高階操作,持有一個 Implementor 的參照。
- RefinedAbstraction(精緻化抽象):擴充 Abstraction 的變體。
- Implementor(實作介面):定義底層原始操作的介面(注意:介面通常較低階,與 Abstraction 的高階操作不必一一對應)。
- ConcreteImplementor(具體實作):實作 Implementor 的各種底層版本。
做法要點:
- 找出兩個獨立變化的維度:一邊當「抽象」,一邊當「實作」。
- 讓 Abstraction 以組合方式持有 Implementor 介面的參照,而不是繼承具體實作。
- Abstraction 的方法把工作委派給所持有的 Implementor。
- 兩邊各自用繼承擴充,組合在執行期決定 → 從「相乘」的類別數變成「相加」。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 與策略模式的物件結構很像(都持有一個介面參照),但意圖不同:橋接關注的是「抽象/實作」這種結構性的長期分離,策略關注的是替換演算法。
- 只有一個維度會變、或組合很少時,先用簡單繼承即可,硬套橋接反而多了間接層。
- 一開始就要正確辨識出哪兩個維度會獨立變化,切錯維度會讓抽象與實作的邊界很彆扭。
🔗 相關工具
- 配接器模式 Adapter(配接器事後補救不相容介面;橋接是設計之初就規劃好分離)
- 裝飾者模式 Decorator(都用組合,但裝飾者是疊加功能,橋接是分離兩個變化維度)
- 工具-優先組合而非繼承(橋接正是「用組合取代繼承以避免類別爆炸」的代表)
- 工具-針對介面編程(Abstraction 只依賴 Implementor 介面)
- 工具-封裝變化點(把「實作會變」這件事封裝在 Implementor 後面)
- 設計模式