🎯 什麼情境該想到我

當你「發現有兩個各自會變化的維度(例如『圖形形狀』和『用哪套繪圖 API』、『遙控器種類』和『控制哪台裝置』),若用繼承硬把兩者綁在一起,子類別會像乘法一樣暴增」的時候。

⚙️ 怎麼用(步驟 / 公式)

意圖:把抽象部分與它的實作部分分離,讓兩者可以各自獨立地變化。

主要參與者 / 結構:

  • Abstraction(抽象):定義高階操作,持有一個 Implementor 的參照。
  • RefinedAbstraction(精緻化抽象):擴充 Abstraction 的變體。
  • Implementor(實作介面):定義底層原始操作的介面(注意:介面通常較低階,與 Abstraction 的高階操作不必一一對應)。
  • ConcreteImplementor(具體實作):實作 Implementor 的各種底層版本。

做法要點:

  1. 找出兩個獨立變化的維度:一邊當「抽象」,一邊當「實作」。
  2. 讓 Abstraction 以組合方式持有 Implementor 介面的參照,而不是繼承具體實作。
  3. Abstraction 的方法把工作委派給所持有的 Implementor。
  4. 兩邊各自用繼承擴充,組合在執行期決定 → 從「相乘」的類別數變成「相加」。

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 與策略模式的物件結構很像(都持有一個介面參照),但意圖不同:橋接關注的是「抽象/實作」這種結構性的長期分離,策略關注的是替換演算法。
  • 只有一個維度會變、或組合很少時,先用簡單繼承即可,硬套橋接反而多了間接層。
  • 一開始就要正確辨識出哪兩個維度會獨立變化,切錯維度會讓抽象與實作的邊界很彆扭。

🔗 相關工具