GoF(四人幫)定義的 23 種經典設計模式,是解決特定上下文中反覆出現問題的經驗總結。它們不是現成的代碼庫,而是思維框架。本文系統梳理所有模式的核心意圖、適用場景與關鍵權衡,助你構建可維護、可擴展的 Java 系統。
| 模式 | 核心意圖 | 關鍵角色 | 適用場景 | 優點/缺點 |
| 適配器 | 將接口轉換為客戶期望的另一接口,使不兼容類協同工作 | Target、Adaptee、Adapter | 第三方庫集成、舊系統遷移、數據格式轉換 | +復用現有類 -過度使用增加間接層 |
| 橋接 | 將抽象與實現解耦,使兩者可獨立變化 | Abstraction、RefinedAbstraction、Implementor、ConcreteImplementor | JDBC 驅動、跨平台圖形庫、消息發送多渠道 | +分離抽象/實現 -增加系統複雜度 |
| 組合 | 將對象組合成樹結構表示「整體-部分」層次,統一單個/組合對象接口 | Component、Leaf、Composite | 文件系統、組織架構、菜單樹、表單組件 | +簡化客戶代碼 -設計過於泛化 |
| 裝飾器 | 動態給對象添加職責,提供比繼承更靈活的擴展方式 | Component、ConcreteComponent、Decorator、ConcreteDecorator | Java IO 流、Servlet Filter、Spring 事務增強 | +運行時動態組合 -產生大量小對象 |
| 外觀 | 為子系統提供統一高層接口,降低客戶端與子系統耦合 | Facade、Subsystem Classes | 服務層聚合、API 網關、簡化複雜框架使用 | +解耦客戶/子系統 -可能成為上帝類 |
| 享元 | 以共享方式高效支持大量細粒度對象 | Flyweight、FlyweightFactory、UnsharedConcreteFlyweight | 字符渲染、連接池、線程池、緩存 | +大幅減少內存 -邏輯複雜、需分離內外狀態 |
| 代理 | 為對象提供代理控制訪問,支持延遲加載、權限、日誌等 | Subject、RealSubject、Proxy | Spring AOP、RPC 框架、圖片懶加載、訪問控制 | +職責分離、開閉原則 -增加調用延遲 |
| 模式 | 核心意圖 | 關鍵角色 | 適用場景 | 優點/缺點 |
| 責任鏈 | 將請求傳遞給鏈上對象,直到某對象處理 | Handler、ConcreteHandler、Client | Servlet Filter、日誌級別過濾、審批流程 | +解耦發送者/接收者 -調試困難、性能開銷 |
| 命令 | 將請求封裝為對象,支持撤銷、隊列、日誌 | Command、ConcreteCommand、Invoker、Receiver | GUI 菜單、事務管理、異步任務隊列 | +解耦調用者/執行者 -類膨脹 |
| 解釋器 | 定義語言文法表示並提供解釋器 | AbstractExpression、Terminal/NonterminalExpression、Context | 正則引擎、SQL 解析、規則引擎、DSL | +易擴展文法 -複雜文法類爆炸 |
| 迭代器 | 順序訪問聚合對象元素,不暴露內部結構 | Iterator、ConcreteIterator、Aggregate、ConcreteAggregate | 集合遍歷、數據庫結果集、樹遍歷 | +統一遍歷接口 -並發修改風險 |
| 中介者 | 封裝對象間交互,將多對多轉為一對多,降低耦合 | Mediator、ConcreteMediator、Colleague | MVC 控制器、機場調度、聊天室 | +簡化對象協議 -中介者可能過於複雜 |
| 備忘錄 | 捕獲對象內部狀態外部化存儲,支持撤銷恢復 | Originator、Memento、Caretaker | 編輯器撤銷、棋局回溯、事務回滾 | +封裝性好 -狀態大時內存開銷大 |
| 觀察者 | 定義一對多依賴,主題變化自動通知觀察者 | Subject、Observer、ConcreteSubject、ConcreteObserver | 事件總線、消息隊列、GUI 事件、Spring 事件 | +解耦主題/觀察者 -循環引用風險、通知風暴 |
| 狀態 | 允許對象在內部狀態改變時改變行為,如換類 | Context、State、ConcreteState | 訂單狀態機、工作流引擎、遊戲角色狀態 | +局部化狀態行為 -狀態類增多 |
| 策略 | 定義算法族,封裝各算法使可互換 | Strategy、ConcreteStrategy、Context | 支付方式、排序算法、壓縮策略、路由算法 | +算法獨立變化 -客戶端需知曉策略差異 |
| 模板方法 | 定義算法骨架,延遲部分步驟到子類實現 | AbstractClass、ConcreteClass | 數據導入導出、報表生成、框架鉤子方法 | +復用邏輯、控制反轉 -逆向控制增加閱讀難度 |
| 訪問者 | 分離數據結構與操作,易於添加新操作 | Visitor、ConcreteVisitor、Element、ConcreteElement、ObjectStructure | 編譯器 AST 遍歷、報表統計、文檔導出 | +易添加操作 -破壞封裝、元素類變化困難 |