首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

大話設計模式(一):模式本質與五大核心設計原則(SOLID)深度解讀

     編輯:Java 綜合教學

什麼是設計模式?

設計模式(Design Pattern)是經驗總結、可復用、被分類編目的代碼設計方案。非算法、非庫、非框架,而是解決特定上下文中反覆出現問題的最佳實踐模板。GoF《設計模式》定義四要素:名字、問題、解決方案、效果。

核心價值:復用設計經驗、提高代碼可讀性、保證系統可靠性、構建工程化軟件結構。

為什麼需要設計模式?

根本目標:代碼復用 + 可維護性。面向對象六大原則(SOLID+LoD)是實現途徑,設計模式是原則的具體落地形態。

  • 開閉原則(OCP):終極目標,對擴展開放、對修改關閉
  • 其餘五原則:實現 OCP 的具體手段與約束

五大核心原則深度剖析

1. 單一職責原則(SRP)

定義:一個類應僅有一個引起變化的原因。
本質:高內聚、低耦合在類級別的體現。職責過多 → 耦合變化原因 → 修改一處破壞他處。
實踐:類/接口/方法層面均適用。識別職責 → 分離職責 → 組合協作。
反例:`UserService` 同時包含註冊、登錄、郵件發送、報表導出、緩存管理。

2. 開閉原則(OCP)

定義:軟件實體(類、模塊、方法)應對擴展開放、對修改關閉。
兩大特徵:A. 擴展開放 B. 修改關閉
應用時機:初期不預判變化;變化發生時,抽象出穩定接口隔離後續同類變化。
關鍵技術:抽象類/接口封裝變化點、多態調用、依賴倒置。
UML 示意:OCP UML圖

3. 裡氏替換原則(LSP)

定義:子類型必須能替換父類型,不破壞程序語義。
核心:Is-A 關係不僅是語法繼承,更是行為契約繼承(前置條件不強於父類、後置條件不弱於父類、不變式保持)。
實現:提取公共行為為抽象基類,子類重寫模板方法。
代碼示例:


abstract class Animal { void eat(); void run(); }
class Cat extends Animal { ... }
class Dog extends Animal { ... }
// 客戶端
Animal a = new Cat(); // 可替換為 Dog、Cattle、Sheep
a.eat(); a.run();

UML:LSP UML圖

4. 依賴倒置原則(DIP)

定義:高層模塊不依賴低層模塊,二者依賴抽象;抽象不依賴細節,細節依賴抽象。
本質:面向接口編程,而非面向實現編程。
反面:`Controller → ServiceImpl → DaoImpl` 緊耦合鏈,修改 DaoImpl 波及全鏈路。
正面:`Controller → ServiceInterface → ServiceImpl`、`DaoInterface → DaoImpl`,雙向依賴抽象。
UML 對比:
反面耦合
依賴倒置後

框架設計核心:Spring IOC 容器、Servlet API、JDBC API、集合框架皆遵循 DIP。

5. 接口隔離原則(ISP)

定義:客戶不應依賴它不需要的接口;一個接口只服務一個角色。
癥狀:「胖接口」包含多組互不相關方法,實現類被迫實現無用方法(拋出 `UnsupportedOperationException`)。
拆分手段:
A. 委托模式:創建適配器類實現細粒度接口,委托給原胖類
B. 多重實現:接口拆分為 `Reader`、`Writer`、`Seeker`,類 `implements Reader, Writer`

設計目標三維度

目標含義模式支撐
可擴展性新需求易添加,不影響現有功能策略、裝飾、工廠方法、觀察者
靈活性代碼修改平滑,不牽一髮動全身適配器、橋接、代理、中介者
可替換性同接口不同實現可無縫切換工廠、抽象工廠、依賴注入、服務定位器

學習設計模式三重境界

  1. 手中有刀,心中無刀:學一個套一個,生搬硬套,項目到處可見單例/工廠
  2. 手中有刀,心中有刀:模式全知曉,遇到問題模式太多不知選哪個,決策癱瘓
  3. 手中無刀,心中無刀:內化六大原則,按需組合模式要素,不拘泥於命名,信手拈來皆是道

終極建議:原則是道,模式是術。修道者,術自現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved