觀點重構
- 歷史背景:GoF 23 種模式主要針對 C++ 靜態類型、無閉包、無反射等語言缺陷的「人肉編譯器優化」。現代語言(Java 8+/Kotlin/Go/Rust)內建大量模式語義(Lambda 替代策略/命令,模塊系統替代外觀/中介者,DI 容器替代工廠/建造者)。
- 核心思想唯一:**依賴倒置(DIP)**。將易變部分抽象為接口,由調用者決定具體實現,實現「對修改關閉,對擴展開放」。模式只是 DIP 在不同場景下的具體代碼結構。
- 「常用」是偽命題:大米天天吃,阿司匹林頭痛才吃。單例在無狀態服務中無處不在;觀察者是事件總線基石;工廠被 DI 容器吸收;適配器無處不在(第三方庫集成);構建者被 Lombok @Builder/DSL 取代。**場景決定模式,而非模式尋找場景。**
- 濫用害處:為套模式引入抽象層、工廠類、策略接口,導致代碼膨脹、調試困難、新人認知負荷高。**能用組合/委託/高階函數解決的,絕不寫繼承體系。**
現代工程師的模式心法
- **識別變化點** → 抽象接口 → 注入實現(構造器注入/方法注入)。
- **優先使用語言內建機制**:Lambda、擴展函數、接口默認方法、密封類、模式匹配。
- **架構層面模式**:分層、六邊形、CQRS、事件溯源、側車模式,比類級模式更具指導意義。
- **重構時引入模式**,而非預先設計。Kent Beck:「讓代碼先跑起來,再重構出模式。」
結語
設計模式是**經驗詞彙表**,溝通時說「這裡用策略模式」比描述十行代碼高效。但寫代碼時,**直接解決問題**,模式會自然浮現。別讓模式綁架了你的設計直覺。