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

Java 設計模式:依賴倒轉原則(DIP)深度解析與實戰

     編輯:Java 相關知識

核心定義

高層模組不應依賴低層模組,兩者都應依賴其抽象;
抽象不應依賴細節,細節應依賴抽象。

問題由來

傳統設計中,高層模組(業務邏輯)直接依賴低層模組(具體實作):

// 高層模組直接依賴具體類別 Book
class Student {
    public void read(Book book) {
        System.out.println("學生開始閱讀:" + book.getName());
    }
}

class Book {
    public String getName() { return "書本"; }
}

當需求變更(如改閱讀 Website),必須修改 Student 類別,違反開閉原則,引入風險。

解決方案:導入抽象介面

定義抽象介面 Reader,高層模組依賴抽象,低層模組實作抽象:

// 抽象介面
interface Reader {
    String getName();
}

// 低層模組實作介面
class Book implements Reader {
    public String getName() { return "書本"; }
}

class Website implements Reader {
    public String getName() { return "網頁"; }
}

// 高層模組依賴抽象
interface Person {
    void read(Reader reader);
}

class Student implements Person {
    @Override
    public void read(Reader reader) {
        System.out.println("學生開始閱讀:" + reader.getName());
    }
}

// 客戶端組裝
public class Test {
    public static void main(String[] args) {
        Person student = new Student();
        student.read(new Book());     // 閱讀書本
        student.read(new Website());  // 閱讀網頁,無需修改 Student
    }
}

依賴倒轉的三大實務準則

  1. 每個類別盡可能有介面或抽象類別:甚至同時擁有介面與抽象類別。
  2. 變數宣告型別盡可能用介面/抽象類別:避免直接使用具體類別型別。
  3. 繼承時遵循里氏替換原則(LSP):子類別必須能替換父類別而不影響正確性。

為什麼抽象比細節穩定?

  • 介面定義「契約」(What),不涉及「實作」(How)
  • 業務規則相對穩定,技術實作變化頻繁(資料庫、框架、通訊協定)
  • 以穩定的抽象為基礎建構架構,系統自然具備彈性與延展性

進階應用:依賴注入(DI)容器

在 Spring 等框架中,DIP 透過控制反轉(IoC)容器落地:

@Service
public class StudentService {
    private final ReaderRepository readerRepository; // 依賴介面

    @Autowired // 建構子注入
    public StudentService(ReaderRepository readerRepository) {
        this.readerRepository = readerRepository;
    }
}

容器負責在執行期注入具體實作(JpaReaderRepository、MockReaderRepository 等),實現編譯期完全解耦。

常見誤區

誤區正確觀念
所有類別都要抽介面僅針對「易變化」或「多實作」的依賴關係導入抽象
DIP 等同於介面導向程式設計DIP 是架構原則,介面導向是落地手段之一
抽象層越多越好過度抽象增加複雜度,需在彈性與簡潔間取得平衡

結語

依賴倒轉原則是物件導向設計六大原則(SOLID)中最具架構指導意義的一條。它強迫我們關注「什麼」而非「如何」,透過抽象介面切斷具體實作的傳播鏈,構建出可測試、可替換、可演進的系統架構。實務中搭配 DI 容器使用,效果最佳。

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