🎯 什麼情境該想到我

當你「手上有個現成或第三方的類別很好用,但它的介面跟你的程式期望的不一樣、直接用會卡住」的時候。你不想(或不能)改動那個類別,只想包一層讓它「假裝」成你要的介面。

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

意圖:把一個類別的介面轉換成客戶端期望的另一個介面,讓原本因為介面不相容而無法合作的類別能夠一起工作。

主要參與者:

  • Target(目標介面):客戶端實際使用、期望呼叫的介面。
  • Adaptee(被適配者):現有、介面不合但功能想用的類別。
  • Adapter(配接器):實作 Target 介面,內部把呼叫轉接到 Adaptee。
  • Client:只認得 Target,透過它與 Adaptee 互動。

做法要點:

  1. 找出客戶端期望的 Target 介面,以及想沿用的 Adaptee。
  2. 建立 Adapter:讓它實作 Target。
  3. 在 Adapter 內部持有一個 Adaptee 的參照(物件配接器,用組合,較常用、較有彈性),把 Target 的方法呼叫翻譯成對 Adaptee 的呼叫;或用多重繼承同時繼承 Target 與 Adaptee(類別配接器)。
  4. 只做介面的轉換,不改變 Adaptee 原本的行為與語意。

🧪 我實際套用的紀錄

  • (待填)

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

  • 配接器只該「調介面」,不該偷偷改變行為;若語意也要變,那是別的問題。
  • 一層層地把 Adapter 疊在 Adapter 上,會讓呼叫鏈難以追蹤、除錯困難。
  • 物件配接器只能適配一個 Adaptee 類別;若要同時覆蓋一整族子類別,得多花心思。
  • 若你能直接改原始碼讓介面一致,通常比硬包一層更乾淨。

🔗 相關工具