《設計模式之禅(第2版)》的繁體中文條列摘要,按章節整理核心概念、原則、模式定義、應用場景及最佳實踐,並輔以簡要說明:
第一部分:六大設計原則
1. 單一職責原則(Single Responsibility Principle, SRP)
- 核心概念:一個類/模塊應僅負責一項職責,避免因多職責導致的耦合與變更風險。
- 關鍵點:
- 類的職責應高內聚(功能單一、邏輯清晰)。
- 違反 SRP 可能導致「脆弱設計」(修改一處影響全局)。
- 最佳實踐:
- 將複雜類拆分為多個細粒度類(如:
User類拆分為UserInfo、UserAuth)。 - 避免「萬能類」(如:
Utils類包山包海)。
- 將複雜類拆分為多個細粒度類(如:
2. 里氏替換原則(Liskov Substitution Principle, LSP)
- 核心概念:子類必須能完全替換父類,而不破壞程式的正確性。
- 關鍵點:
- 子類應擴展父類功能,而非縮減或違背(如:重寫方法時不能拋出新的異常)。
- 違反 LSP 會導致「繼承濫用」(如:正方形繼承長方形但破壞其寬高獨立性)。
- 最佳實踐:
- 使用組合優於繼承(如:委託設計模式)。
- 避免「強制轉型」來修復設計缺陷。
3. 依賴倒置原則(Dependency Inversion Principle, DIP)
- 核心概念:高層模塊不應依賴低層模塊,兩者都應依賴抽象(接口/抽象類)。
- 關鍵點:
- 「面向接口編程」而非「面向實現編程」。
- 依賴三種寫法:
- 構造函數注入(推薦)。
- Setter 注入。
- 接口注入(少用)。
- 最佳實踐:
- 使用依賴注入(DI)框架(如 Spring)管理依賴。
- 避免硬編碼具體類(如:
new UserDao())。
4. 接口隔離原則(Interface Segregation Principle, ISP)
- 核心概念:客戶端不應被迫依賴它不使用的胖接口,應拆分為多個專一接口。
- 關鍵點:
- 避免「萬能接口」(如:
IAnimal包含fly()、swim())。 - 接口應細粒度且高內聚。
- 避免「萬能接口」(如:
- 最佳實踐:
- 根據角色拆分接口(如:
IFlyAnimal、ISwimAnimal)。 - 使用適配器模式兼容舊接口。
- 根據角色拆分接口(如:
5. 迪米特法則(Law of Demeter, LoD)
- 核心概念:一個類對其他類的了解應最少化,只與「直接朋友」交互。
- 關鍵點:
- 「直接朋友」:成員變量、方法參數、返回值。
- 違反 LoD 會導致「類間耦合過高」(如:
A -> B -> C -> D的鏈式調用)。
- 最佳實踐:
- 使用中介者模式減少類間依賴。
- 避免「火車事故」式代碼(如:
a.getB().getC().doSomething())。
6. 开閉原則(Open/Closed Principle, OCP)
- 核心概念:軟體實體(類/模塊)應對擴展開放,對修改封閉。
- 關鍵點:
- 通過抽象層(接口/抽象類)實現擴展性。
- 違反 OCP 會導致「修改成本高」(如:每次需求變更都要改核心類)。
- 最佳實踐:
- 使用策略模式、模板方法模式等支持擴展。
- 遵循「設計模式」與「重構」技巧。
第二部分:23 種設計模式
創建型模式(5種)
單例模式(Singleton)
- 定義:確保類僅有一個實例,並提供全局訪問點。
- 應用場景:日誌管理器、資源池、配置文件。
- 實現方式:
- 懶漢式(線程不安全,需加鎖)。
- 餓漢式(線程安全,但浪費資源)。
- 雙重檢查鎖(推薦)。
- 最佳實踐:避免濫用單例(如:無狀態工具類不需單例)。
工廠方法模式(Factory Method)
- 定義:定義創建對象的接口,由子類決定實例化哪個類。
- 應用場景:框架中解耦客戶端與具體類(如:UI 元件工廠)。
- 最佳實踐:結合依賴倒置原則,客戶端依賴抽象工廠。
抽象工廠模式(Abstract Factory)
- 定義:提供一個接口,創建相關或依賴對象的家族。
- 應用場景:跨平台 UI 元件(如:Windows/Linux 按鈕、菜單)。
- 最佳實踐:避免過度設計,僅在對象族有明顯關聯時使用。
建造者模式(Builder)
- 定義:將複雜對象的構建與表示分離,支持逐步構建。
- 應用場景:創建複雜對象(如:SQL 查詢、HTML 生成器)。
- 最佳實踐:使用流式 API(如:
User.builder().name("Alice").age(25).build())。
原型模式(Prototype)
- 定義:通過複製現有對象創建新對象,避免重複初始化。
- 應用場景:性能優化(如:遊戲中複製怪物屬性)。
- 注意事項:深拷貝 vs. 淺拷貝(需實現
Cloneable接口)。 - 最佳實踐:結合序列化實現深拷貝。
結構型模式(7種)
適配器模式(Adapter)
- 定義:將不兼容接口轉換為客戶端期望的接口。
- 應用場景:整合第三方庫(如:支付網關適配器)。
- 類型:
- 類適配器(繼承)。
- 對象適配器(組合,推薦)。
- 最佳實踐:優先使用組合適配器,避免多重繼承。
裝飾模式(Decorator)
- 定義:動態為對象添加職責,而不修改其類。
- 應用場景:Java I/O 流(如:
BufferedInputStream)。 - 最佳實踐:避免過度裝飾導致的「包裝地獄」。
代理模式(Proxy)
- 定義:為其他對象提供代理以控制訪問(如:權限、延遲初始化)。
- 類型:
- 靜態代理(手動實現)。
- 動態代理(Java
InvocationHandler)。
- 應用場景:AOP(如:Spring 事務管理)。
外觀模式(Facade)
- 定義:為子系統提供簡化接口,隱藏複雜性。
- 應用場景:第三方 SDK 包裝(如:支付 SDK 外觀類)。
- 最佳實踐:避免「萬能外觀」導致的低內聚。
橋接模式(Bridge)
- 定義:將抽象與實現分離,兩者可獨立變化。
- 應用場景:圖形渲染(如:形狀與顏色分離)。
- 最佳實踐:結合依賴注入提高靈活性。
組合模式(Composite)
- 定義:將對象組合成樹形結構,統一處理單個對象與組合對象。
- 應用場景:文件系統(文件夾與文件)。
- 最佳實踐:使用透明組合模式(葉子節點與容器節點共享接口)。
享元模式(Flyweight)
- 定義:共享細粒度對象,減少內存使用。
- 應用場景:遊戲中重複紋理、字符緩存。
- 最佳實踐:結合工廠模式管理享元池。
行為型模式(11種)
策略模式(Strategy)
- 定義:定義一系列算法,封裝並互相替換。
- 應用場景:支付方式選擇(信用卡、PayPal)。
- 最佳實踐:結合工廠模式動態切換策略。
模板方法模式(Template Method)
- 定義:在父類定義算法骨架,子類實現細節。
- 應用場景:框架回調(如:Spring JdbcTemplate)。
- 最佳實踐:使用鉤子方法(
hook())控制子類行為。
觀察者模式(Observer)
- 定義:對象間一對多依賴,當主體變化時通知觀察者。
- 應用場景:事件驅動系統(如:GUI 按鈕點擊)。
- 最佳實踐:
- 推模式(主動推送事件)。
- 拉模式(觀察者主動查詢)。
狀態模式(State)
- 定義:允許對象在內部狀態改變時改變行為。
- 應用場景:訂單狀態流轉(待支付→已發貨)。
- 最佳實踐:避免狀態類過多導致的複雜性。
責任鏈模式(Chain of Responsibility)
- 定義:將請求沿鏈條傳遞,直到被處理。
- 應用場景:權限驗證(如:中間件鏈)。
- 最佳實踐:設置終止條件避免無限循環。
命令模式(Command)
- 定義:將請求封裝為對象,支持隊列、日誌、撤銷。
- 應用場景:GUI 命令(如:撤銷/重做)。
- 最佳實踐:結合備忘錄模式實現撤銷功能。
中介者模式(Mediator)
- 定義:減少類間直接依賴,通過中介者協調。
- 應用場景:聊天室(用戶間消息由服務器轉發)。
- 最佳實踐:避免中介者成為「上帝類」。
迭代器模式(Iterator)
- 定義:提供統一方式遍歷集合,隱藏內部結構。
- 應用場景:Java
Collection框架。 - 最佳實踐:實現
remove()方法時確保線程安全。
訪問者模式(Visitor)
- 定義:將數據結構與操作分離,支持新增操作而不修改結構。
- 應用場景:編譯器(語法樹遍歷)。
- 最佳實踐:適用於穩定數據結構、變化操作。
備忘錄模式(Memento)
- 定義:捕獲對象內部狀態,支持撤銷/恢復。
- 應用場景:遊戲存檔、文本編輯器撤銷。
- 最佳實踐:使用序列化簡化狀態儲存。
解釋器模式(Interpreter)
- 定義:定義語法表示,並提供解釋器。
- 應用場景:SQL 解析器、正則表達式。
- 最佳實踐:僅在簡單語法下使用,複雜場景考慮編譯器。
第三部分:擴展模式(第38章)
38.1 工作流模式(Workflow)
- 定義:自動化業務流程,通過規則驅動任務執行。
- 應用場景:審批流程(如:請假流程)。
- 最佳實踐:結合狀態模式管理流程狀態。
38.2 管道-過濾器模式(Pipes and Filters)
- 定義:數據通過管道在過濾器間流動,支持模塊化處理。
- 應用場景:ETL(數據抽取、轉換、加載)。
- 最佳實踐:使用異步隊列提高吞吐量。
38.3 雇工模式(Worker Thread)
- 定義:簡化的命令模式,將任務分配給線程池執行。
- 應用場景:後台任務處理(如:日誌寫入)。
- 最佳實踐:結合線程池管理資源。
38.4 黑板模式(Blackboard)
- 定義:觀察者模式的擴展,支持多讀寫者解耦。
- 實現方式:
- 拉模式:消費者主動拉取(如:數據庫作為黑板)。
- 推模式:消息隊列主動推送(如:Kafka)。
- 最佳實踐:使用消息過濾器減少無關消息處理。
38.5 空對象模式(Null Object)
- 定義:避免
null检查,提供默認空實現。 - 應用場景:避免 NPE(如:
NullAnimal實現Animal接口)。 - 最佳實踐:作為編碼規範的一部分,簡化條件判斷。
總結
- 設計原則是模式的基石,遵循 SOLID 原則(SRP、OCP、LSP、ISP、DIP)能提高代碼可維護性。
- 創建型模式關注對象創建,結構型模式關注對象組合,行為型模式關注對象交互。
- 擴展模式針對特定場景(如:並發、分佈式)提供解決方案。
- 最佳實踐:
- 避免過度設計,根據項目複雜度選擇合適模式。
- 結合設計原則與重構技巧,逐步優化代碼。
沒有留言:
張貼留言