設計模式(Design Pattern)是經驗總結、可復用、被分類編目的代碼設計方案。非算法、非庫、非框架,而是解決特定上下文中反覆出現問題的最佳實踐模板。GoF《設計模式》定義四要素:名字、問題、解決方案、效果。
核心價值:復用設計經驗、提高代碼可讀性、保證系統可靠性、構建工程化軟件結構。
根本目標:代碼復用 + 可維護性。面向對象六大原則(SOLID+LoD)是實現途徑,設計模式是原則的具體落地形態。
定義:一個類應僅有一個引起變化的原因。
本質:高內聚、低耦合在類級別的體現。職責過多 → 耦合變化原因 → 修改一處破壞他處。
實踐:類/接口/方法層面均適用。識別職責 → 分離職責 → 組合協作。
反例:`UserService` 同時包含註冊、登錄、郵件發送、報表導出、緩存管理。
定義:軟件實體(類、模塊、方法)應對擴展開放、對修改關閉。
兩大特徵:A. 擴展開放 B. 修改關閉
應用時機:初期不預判變化;變化發生時,抽象出穩定接口隔離後續同類變化。
關鍵技術:抽象類/接口封裝變化點、多態調用、依賴倒置。
UML 示意:
定義:子類型必須能替換父類型,不破壞程序語義。
核心:Is-A 關係不僅是語法繼承,更是行為契約繼承(前置條件不強於父類、後置條件不弱於父類、不變式保持)。
實現:提取公共行為為抽象基類,子類重寫模板方法。
代碼示例:
abstract class Animal { void eat(); void run(); }
class Cat extends Animal { ... }
class Dog extends Animal { ... }
// 客戶端
Animal a = new Cat(); // 可替換為 Dog、Cattle、Sheep
a.eat(); a.run();
UML:
定義:高層模塊不依賴低層模塊,二者依賴抽象;抽象不依賴細節,細節依賴抽象。
本質:面向接口編程,而非面向實現編程。
反面:`Controller → ServiceImpl → DaoImpl` 緊耦合鏈,修改 DaoImpl 波及全鏈路。
正面:`Controller → ServiceInterface → ServiceImpl`、`DaoInterface → DaoImpl`,雙向依賴抽象。
UML 對比:


框架設計核心:Spring IOC 容器、Servlet API、JDBC API、集合框架皆遵循 DIP。
定義:客戶不應依賴它不需要的接口;一個接口只服務一個角色。
癥狀:「胖接口」包含多組互不相關方法,實現類被迫實現無用方法(拋出 `UnsupportedOperationException`)。
拆分手段:
A. 委托模式:創建適配器類實現細粒度接口,委托給原胖類
B. 多重實現:接口拆分為 `Reader`、`Writer`、`Seeker`,類 `implements Reader, Writer`
| 目標 | 含義 | 模式支撐 |
|---|---|---|
| 可擴展性 | 新需求易添加,不影響現有功能 | 策略、裝飾、工廠方法、觀察者 |
| 靈活性 | 代碼修改平滑,不牽一髮動全身 | 適配器、橋接、代理、中介者 |
| 可替換性 | 同接口不同實現可無縫切換 | 工廠、抽象工廠、依賴注入、服務定位器 |
終極建議:原則是道,模式是術。修道者,術自現。