「每個模式描述一個反覆出現的問題及其解決方案核心,使你能反覆使用該方案而不重復勞動。」—— GOF
軟件隨業務演進持續變更,模式目標:復用代碼、擴展功能、最小化修改現有代碼。
對擴展開放,對修改關閉。 新增功能通過增加代碼實現,而非修改核心邏輯。抽象化是關鍵(介面/抽象類定義穩定契約)。
一個類僅有一個引起變化的原因。職責過度耦合會導致修改一處牽一髮動全身。粒度把握:隨項目複雜度遞進細化。
找出系統變化點,將其封裝到獨立對象/層中。
兩點要求:
① 同類變化不分散;
② 不同變化不混合。
子類型必須能替換父類型且不影響正確性。
含義:
① 子類可實現父類抽象方法,不可覆蓋非抽象方法(破壞契約);
② 子類可新增方法;
③ 重載時參數更寬鬆(逆變);
④ 實現時返回更嚴格(協變)。
① 高層模塊不依賴低層模塊,雙方依賴抽象。
② 抽象不依賴細節,細節依賴抽象。
③ 面向介面編程:Encryption e = new MD5Encryption(); → 換算法只改實例化處。
多個專用介面優於單一臃腫介面。避免實現類被迫依賴不需要的方法(「胖介面」污染)。
優先組合/聚合,少用繼承。
繼承:強耦合、破壞封裝、靜態編譯期綁定。
組合:弱耦合、運行期動態替換、符合 DIP。
只與直接朋友通信。若 A 需調用 C,應通過 B 轉發(A→B→C),降低耦合、控制信息過載。
OCP (目標)
↑
DIP (手段:倒轉依賴)
↑
LSP (基礎:保證替換安全)
↑
ISP / CARP / LoD / SRP / EVP (具體編碼層面的落地準則)