星期四, 1月 29, 2026

設計模式之禅(第2版)》的繁體中文條列摘要,按章節整理核心概念、原則、模式定義、應用場景及最佳實踐,並輔以簡要說明:


第一部分:六大設計原則

1. 單一職責原則(Single Responsibility Principle, SRP)

  • 核心概念:一個類/模塊應僅負責一項職責,避免因多職責導致的耦合與變更風險。
  • 關鍵點
    • 類的職責應高內聚(功能單一、邏輯清晰)。
    • 違反 SRP 可能導致「脆弱設計」(修改一處影響全局)。
  • 最佳實踐
    • 將複雜類拆分為多個細粒度類(如:User 類拆分為 UserInfoUserAuth)。
    • 避免「萬能類」(如:Utils 類包山包海)。

2. 里氏替換原則(Liskov Substitution Principle, LSP)

  • 核心概念:子類必須能完全替換父類,而不破壞程式的正確性。
  • 關鍵點
    • 子類應擴展父類功能,而非縮減或違背(如:重寫方法時不能拋出新的異常)。
    • 違反 LSP 會導致「繼承濫用」(如:正方形繼承長方形但破壞其寬高獨立性)。
  • 最佳實踐
    • 使用組合優於繼承(如:委託設計模式)。
    • 避免「強制轉型」來修復設計缺陷。

3. 依賴倒置原則(Dependency Inversion Principle, DIP)

  • 核心概念:高層模塊不應依賴低層模塊,兩者都應依賴抽象(接口/抽象類)。
  • 關鍵點
    • 「面向接口編程」而非「面向實現編程」。
    • 依賴三種寫法:
      1. 構造函數注入(推薦)。
      2. Setter 注入。
      3. 接口注入(少用)。
  • 最佳實踐
    • 使用依賴注入(DI)框架(如 Spring)管理依賴。
    • 避免硬編碼具體類(如:new UserDao())。

4. 接口隔離原則(Interface Segregation Principle, ISP)

  • 核心概念:客戶端不應被迫依賴它不使用的胖接口,應拆分為多個專一接口
  • 關鍵點
    • 避免「萬能接口」(如:IAnimal 包含 fly()swim())。
    • 接口應細粒度高內聚
  • 最佳實踐
    • 根據角色拆分接口(如:IFlyAnimalISwimAnimal)。
    • 使用適配器模式兼容舊接口。

5. 迪米特法則(Law of Demeter, LoD)

  • 核心概念:一個類對其他類的了解應最少化,只與「直接朋友」交互。
  • 關鍵點
    • 「直接朋友」:成員變量、方法參數、返回值。
    • 違反 LoD 會導致「類間耦合過高」(如:A -> B -> C -> D 的鏈式調用)。
  • 最佳實踐
    • 使用中介者模式減少類間依賴。
    • 避免「火車事故」式代碼(如:a.getB().getC().doSomething())。

6. 开閉原則(Open/Closed Principle, OCP)

  • 核心概念:軟體實體(類/模塊)應對擴展開放,對修改封閉
  • 關鍵點
    • 通過抽象層(接口/抽象類)實現擴展性。
    • 違反 OCP 會導致「修改成本高」(如:每次需求變更都要改核心類)。
  • 最佳實踐
    • 使用策略模式模板方法模式等支持擴展。
    • 遵循「設計模式」與「重構」技巧。

第二部分:23 種設計模式

創建型模式(5種)

  1. 單例模式(Singleton)

    • 定義:確保類僅有一個實例,並提供全局訪問點。
    • 應用場景:日誌管理器、資源池、配置文件。
    • 實現方式
      • 懶漢式(線程不安全,需加鎖)。
      • 餓漢式(線程安全,但浪費資源)。
      • 雙重檢查鎖(推薦)。
    • 最佳實踐:避免濫用單例(如:無狀態工具類不需單例)。
  2. 工廠方法模式(Factory Method)

    • 定義:定義創建對象的接口,由子類決定實例化哪個類。
    • 應用場景:框架中解耦客戶端與具體類(如:UI 元件工廠)。
    • 最佳實踐:結合依賴倒置原則,客戶端依賴抽象工廠。
  3. 抽象工廠模式(Abstract Factory)

    • 定義:提供一個接口,創建相關或依賴對象的家族
    • 應用場景:跨平台 UI 元件(如:Windows/Linux 按鈕、菜單)。
    • 最佳實踐:避免過度設計,僅在對象族有明顯關聯時使用。
  4. 建造者模式(Builder)

    • 定義:將複雜對象的構建與表示分離,支持逐步構建。
    • 應用場景:創建複雜對象(如:SQL 查詢、HTML 生成器)。
    • 最佳實踐:使用流式 API(如:User.builder().name("Alice").age(25).build())。
  5. 原型模式(Prototype)

    • 定義:通過複製現有對象創建新對象,避免重複初始化。
    • 應用場景:性能優化(如:遊戲中複製怪物屬性)。
    • 注意事項:深拷貝 vs. 淺拷貝(需實現 Cloneable 接口)。
    • 最佳實踐:結合序列化實現深拷貝。

結構型模式(7種)

  1. 適配器模式(Adapter)

    • 定義:將不兼容接口轉換為客戶端期望的接口。
    • 應用場景:整合第三方庫(如:支付網關適配器)。
    • 類型
      • 類適配器(繼承)。
      • 對象適配器(組合,推薦)。
    • 最佳實踐:優先使用組合適配器,避免多重繼承。
  2. 裝飾模式(Decorator)

    • 定義:動態為對象添加職責,而不修改其類。
    • 應用場景:Java I/O 流(如:BufferedInputStream)。
    • 最佳實踐:避免過度裝飾導致的「包裝地獄」。
  3. 代理模式(Proxy)

    • 定義:為其他對象提供代理以控制訪問(如:權限、延遲初始化)。
    • 類型
      • 靜態代理(手動實現)。
      • 動態代理(Java InvocationHandler)。
    • 應用場景:AOP(如:Spring 事務管理)。
  4. 外觀模式(Facade)

    • 定義:為子系統提供簡化接口,隱藏複雜性。
    • 應用場景:第三方 SDK 包裝(如:支付 SDK 外觀類)。
    • 最佳實踐:避免「萬能外觀」導致的低內聚。
  5. 橋接模式(Bridge)

    • 定義:將抽象與實現分離,兩者可獨立變化。
    • 應用場景:圖形渲染(如:形狀與顏色分離)。
    • 最佳實踐:結合依賴注入提高靈活性。
  6. 組合模式(Composite)

    • 定義:將對象組合成樹形結構,統一處理單個對象與組合對象。
    • 應用場景:文件系統(文件夾與文件)。
    • 最佳實踐:使用透明組合模式(葉子節點與容器節點共享接口)。
  7. 享元模式(Flyweight)

    • 定義:共享細粒度對象,減少內存使用。
    • 應用場景:遊戲中重複紋理、字符緩存。
    • 最佳實踐:結合工廠模式管理享元池。

行為型模式(11種)

  1. 策略模式(Strategy)

    • 定義:定義一系列算法,封裝並互相替換。
    • 應用場景:支付方式選擇(信用卡、PayPal)。
    • 最佳實踐:結合工廠模式動態切換策略。
  2. 模板方法模式(Template Method)

    • 定義:在父類定義算法骨架,子類實現細節。
    • 應用場景:框架回調(如:Spring JdbcTemplate)。
    • 最佳實踐:使用鉤子方法hook())控制子類行為。
  3. 觀察者模式(Observer)

    • 定義:對象間一對多依賴,當主體變化時通知觀察者。
    • 應用場景:事件驅動系統(如:GUI 按鈕點擊)。
    • 最佳實踐
      • 推模式(主動推送事件)。
      • 拉模式(觀察者主動查詢)。
  4. 狀態模式(State)

    • 定義:允許對象在內部狀態改變時改變行為。
    • 應用場景:訂單狀態流轉(待支付→已發貨)。
    • 最佳實踐:避免狀態類過多導致的複雜性。
  5. 責任鏈模式(Chain of Responsibility)

    • 定義:將請求沿鏈條傳遞,直到被處理。
    • 應用場景:權限驗證(如:中間件鏈)。
    • 最佳實踐:設置終止條件避免無限循環。
  6. 命令模式(Command)

    • 定義:將請求封裝為對象,支持隊列、日誌、撤銷。
    • 應用場景:GUI 命令(如:撤銷/重做)。
    • 最佳實踐:結合備忘錄模式實現撤銷功能。
  7. 中介者模式(Mediator)

    • 定義:減少類間直接依賴,通過中介者協調。
    • 應用場景:聊天室(用戶間消息由服務器轉發)。
    • 最佳實踐:避免中介者成為「上帝類」。
  8. 迭代器模式(Iterator)

    • 定義:提供統一方式遍歷集合,隱藏內部結構。
    • 應用場景:Java Collection 框架。
    • 最佳實踐:實現remove() 方法時確保線程安全。
  9. 訪問者模式(Visitor)

    • 定義:將數據結構與操作分離,支持新增操作而不修改結構。
    • 應用場景:編譯器(語法樹遍歷)。
    • 最佳實踐:適用於穩定數據結構、變化操作
  10. 備忘錄模式(Memento)

    • 定義:捕獲對象內部狀態,支持撤銷/恢復。
    • 應用場景:遊戲存檔、文本編輯器撤銷。
    • 最佳實踐:使用序列化簡化狀態儲存。
  11. 解釋器模式(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)能提高代碼可維護性。
  • 創建型模式關注對象創建,結構型模式關注對象組合,行為型模式關注對象交互。
  • 擴展模式針對特定場景(如:並發、分佈式)提供解決方案。
  • 最佳實踐
    • 避免過度設計,根據項目複雜度選擇合適模式。
    • 結合設計原則重構技巧,逐步優化代碼。

 

沒有留言: