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

Java 程式設計師必懂的 10 大面向物件設計原則:SOLID、DRY、組合優於繼承實戰指南

     編輯:Java 相關知識

前言

設計模式 (Singleton、Decorator、Observer) 固然重要,但**面向物件設計原則 (OOD Principles)** 才是寫出可維護、可擴展代碼的根基。許多資深工程師聽過 Design Patterns 卻說不清 SOLID。本文精煉 10 大核心原則,附實戰場景。

原則速查表

#原則核心口訣關鍵收益
1DRY (Don't Repeat Yourself)抽象共性,避免重複易維護,單點修改
2封裝變化識別易變點,封裝起來隔離影響範圍
3開閉原則 (OCP)對擴展開放,對修改關閉不動舊代碼加新功能
4單一職責 (SRP)一個類只做一件事降低耦合,易測試
5依賴倒置 (DIP)依賴抽象而非具體解耦,利於 Mock 測試
6組合優於繼承用 HAS-A 代替 IS-A運行期動態換行為
7里氏替換 (LSP)子類必須能替換父類保證多態正確性
8介面隔離 (ISP)多個專用介面優於一個大介面減少無用方法實現
9面向介面編程用介面類型宣告變數/參數/回傳實現細節可替換
10委派原則讓專人做專事 (如 equals/hashCode)避免重複,集中維護

深度解析精選原則

1. DRY — 不要重複自己

  • **代碼重複** → 抽取方法/工具類/基類
  • **功能重複** → 警惕!訂單驗證與身分證驗證邏輯相似但**業務語義不同**,強行合併會導致「改一處壞兩邊」

2. 封裝變化

  • 預測未來變化點:建構邏輯、演算法策略、外部 API 呼叫
  • Factory Pattern 封裝「物件建構」、Strategy Pattern 封裝「演算法」
  • Java 實踐:預設 `private`,按需放寬至 `protected`/`package-private`

3. 開閉原則 (OCP)

  • 新增功能 → 新增類/實現介面,而非修改既有類
  • JDK 範例:`BorderFactory` (Factory)、`Runtime.getRuntime()` (Singleton)
  • 《Effective Java》條目 18:介面優於抽象類,利於演進

6. 組合優於繼承

// 繼承:編譯期固定,破壞封裝,父類改動波及子類
class Bird { void fly() {} }
class Penguin extends Bird { /* 不會飛卻繼承 fly */ }

// 組合:運行期動態注入行為
interface FlyBehavior { void fly(); }
class Bird {
    private FlyBehavior flyBehavior;
    public void setFlyBehavior(FlyBehavior fb) { this.flyBehavior = fb; }
    public void performFly() { flyBehavior.fly(); }
}

《Effective Java》條目 18 強力推薦。

7. 里氏替換原則 (LSP)

  • 子類必須**增強**而非削弱父類行為
  • 違反例:`Square extends Rectangle` 導致 `setWidth`/`setHeight` 邏輯衝突
  • 與 SRP、ISP 緊密相關

9. 面向介面編程

// 悪例
ArrayList<String> list = new ArrayList<>();
list.add("a");

// 優例
List<String> list = new ArrayList<>(); // 變數型別用介面
// 後續可無縫換成 LinkedList、CopyOnWriteArrayList
  • 方法參數、回傳值、欄位宣告均優先用介面型別
  • 學習資源推薦

    • Joshua Bloch《Effective Java》第 3 版
    • Kathy Sierra《Head First Design Patterns》
    • 《Head First Object-Oriented Analysis and Design》
    • Apache / OpenJDK 原始碼閱讀

    總結

    理論是第一步,**實戰中反覆權衡、重構、體會** 才能內化。原則非教條,權衡取捨才是架構師核心能力。

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