🎨 設計模式 GoF
Design Patterns — 四人幫 本質:封裝變化
🎯 什麼情境該想到我
當你的程式碼「依賴具體類別」導致改一處動全身、難替換、難測試時。
⚙️ 怎麼用
- 依賴抽象(介面/父型別),不依賴具體實作:呼叫端只認介面。
- 物件的建立與使用分離:用工廠/注入取得具體實作,使用處不 new 具體類別。
- 好處:實作可自由替換(換套件、換演算法)、可在測試中換測試替身。
🧪 我實際套用的紀錄
- 2026-07-14:(待填)
⚠️ 注意
- 別為了「未來也許會變」而到處加介面;在確有變化點或需要測試隔離時才抽(見 工具-封裝變化點)。
🔗 相關工具
- 工具-優先組合而非繼承 —— 常一起用,組合進來的東西是介面,換實作才不牽動使用端
- 工具-封裝變化點 —— 目的,介面是把變化藏起來最常用的那道牆
- 工具-打破依賴以便測試 —— 驗收方式,能不能塞測試替身進去,就是介面抽對沒有的檢查
- 工具-介面設計原則 —— 品質要求,介面本身設計不好,抽象只是換個地方糾纏
🎯 什麼情境該想到我
當某部分需求「經常改」、每次一改就要動很多地方,想把變化隔離起來時。這是所有設計模式的共同本質。
⚙️ 怎麼用
- 找出「會變」與「不變」的部分:把兩者分開。
- 把會變的部分抽成獨立元件(介面 + 可替換實作),讓不變的部分依賴抽象。
- 未來需求變動只需新增/替換那個元件,不動其餘(呼應 工具-開閉原則)。
例:付款方式會變 → 抽出 PaymentMethod 介面,新增付款方式=加一個實作。
🧪 我實際套用的紀錄
- 2026-07-14:(待填)
⚠️ 注意
- 只封裝「真的會變」的點;對不會變的東西加彈性=過度設計、徒增複雜度。
🔗 相關工具
- 工具-針對介面編程 —— 封裝變化的落地方式,把會變的部分藏到介面後面
- 工具-優先組合而非繼承 —— 組裝方式,用組合替換變化的部分比用繼承覆寫更好抽換
- 工具-管理複雜度 —— 上位準則,封裝變化本質上是在降低要同時記住的東西
🧭 設計心法(先於模式)
🏗 創建型 Creational(5) 管「怎麼建立物件」 [[抽象工廠模式]]・[[建造者模式]]・[[工廠方法模式]]・[[原型模式]]・[[單例模式]]
🧩 結構型 Structural(7) 管「怎麼組合物件與類別」 [[配接器模式]]・[[橋接模式]]・[[組合模式]]・[[裝飾者模式]]・[[外觀模式]]・[[享元模式]]・[[代理模式]]
🔄 行為型 Behavioral(11) 管「物件間怎麼分工與溝通」 [[責任鏈模式]]・[[命令模式]]・[[直譯器模式]]・[[迭代器模式]]・[[中介者模式]]・[[備忘錄模式]]・[[觀察者模式]]・[[狀態模式]]・[[策略模式]]・[[範本方法模式]]・[[訪問者模式]]
📖 模式型錄(23)
[[策略模式|Strategy]] vs [[狀態模式|State]] 選演算法 vs 隨狀態換行為
[[裝飾者模式|Decorator]] vs [[代理模式|Proxy]] 加功能 vs 控制存取
[[配接器模式|Adapter]] vs [[橋接模式|Bridge]] 事後轉介面 vs 事前分離抽象與實作
⚖️ 容易混淆的孿生