設計模式是軟體開發中**經驗總結的可復用解決方案模板**,針對特定情境下的重複問題。每個模式包含:
| 原則 | 核心思想 | 關鍵字 |
|---|---|---|
| 單一職責 (SRP) | 一個類別只負責一項功能 | 內聚 |
| 開放封閉 (OCP) | 對擴展開放,對修改關閉 | 抽象、多型 |
| 里氏替換 (LSP) | 子類別必須能替換父類別 | 契約、繼承 |
| 介面隔離 (ISP) | 介面精小,不強迫實現不需要的方法 | 解耦 |
| 依賴倒置 (DIP) | 高層模組不依賴低層,雙方依賴抽象 | 介面、注入 |
| 迪米特法則 (LoD) | 最少知識,只與直接朋友溝通 | 低耦合 |
| 合成復用 (CRP) | 優先組合/聚合,少用繼承 | 組合>繼承 |
定義:模組間相依程度的度量。耦合越強,修改一模組影響其他模組的風險越高,獨立性越差。
| 耦合類型 | 強度 | 說明 | 建議 |
|---|---|---|---|
| 內容耦合 | 最強 | 直接修改另一模組內部資料/代碼 | 嚴禁 |
| 共用耦合 | 強 | 共用全域資料區 | 避免 |
| 控制耦合 | 中 | 傳遞控制旗標/開關決定邏輯 | 減少 |
| 標記耦合 | 中 | 傳遞資料結構 (陣列/物件) | 可接受 |
| 資料耦合 | 弱 | 僅傳遞基本型別參數 | 推薦 |
| 無耦合 | 最弱 | 模組間無直接關聯 | 理想 |
目標:高內聚、低耦合。透過介面、依賴注入、事件總線、中介者模式降低耦合。
定義:同一介面、不同實現。將「是什麼」(介面) 與「怎麼做」(實現) 分離。
價值:
| 模式 | 核心意圖 | 關鍵詞 |
|---|---|---|
| Singleton (單例) | 全域唯一實例 | 私有建構子、靜態獲取 |
| Factory Method (工廠方法) | 延遲到子類決定實例化哪個類 | 抽象工廠、多型 |
| Abstract Factory (抽象工廠) | 創建相關/相依物件家族 | 介面、多產品族 |
| Builder (建造者) | 分步驟建構複雜物件 | 鏈式調用、Director |
| Prototype (原型) | 透過複製現有實例創建新物件 | clone、原型管理器 |
| 模式 | 核心意圖 | 關鍵詞 |
|---|---|---|
| Adapter (適配器) | 轉換介面使不兼容類別協作 | Wrapper、介面轉換 |
| Bridge (橋接) | 抽象與實現分離獨立變化 | 兩個維度、組合 |
| Composite (組合) | 樹狀結構統一單一/容器物件 | 遞歸、Component |
| Decorator (裝飾者) | 動態添加職責,替代繼承 | 包裝、疊加 |
| Facade (外觀) | 提供子系統統一高層介面 | 簡化介面、門面 |
| Flyweight (享元) | 共享細粒度物件節省記憶體 | 內部/外部狀態、池 |
| Proxy (代理) | 控制對真實物件的訪問 | 延遲載入、權限、日誌 |
| 模式 | 核心意圖 | 關鍵詞 |
|---|---|---|
| Chain of Responsibility (職責鏈) | 請求沿鏈傳遞,自動處理 | Handler、next |
| Command (命令) | 將請求封裝為物件 | Receiver、Invoker、Undo |
| Interpreter (解釋器) | 定義語言文法與解釋器 | AST、Context |
| Iterator (迭代器) | 順序存取聚合物件元素 | next、current、yield |
| Mediator (中介者) | 封裝物件間交互,降低耦合 | Hub、Colleague |
| Memento (備忘錄) | 捕獲/恢復物件內部狀態 | Originator、Caretaker |
| Observer (觀察者) | 一對多依賴,狀態變更自動通知 | 發布/訂閱、Subject |
| State (狀態) | 物件行為隨內部狀態改變 | State介面、Context |
| Strategy (策略) | 封裝演算法族,可互換 | 演算法介面、Context |
| Template Method (模板方法) | 定義演算法骨架,子類實現步驟 | 鉤子方法、final |
| Visitor (訪問者) | 分離演算法與物件結構 | 雙分派、accept/visit |