本文為設計模式系列第3篇,聚焦依賴倒置、接口隔離、迪米特法則三大設計原則,系統梳理定義、實際業務場景、優缺點、最佳實踐與常見誤區,適合系統學習與團隊協作。
目錄
- 1. 引言
- 2. 依賴倒置原則(DIP)
- 3. 接口隔離原則(ISP)
- 4. 迪米特法則(LoD)
- 5. 常見誤區與反例
- 6. 最佳實踐
- 7. 參考資料與延伸閱讀
1. 引言
在上一文中,我們介紹了單一職責、開放封閉和里氏替換原則。本文將繼續介紹另外三大設計原則:依賴倒置原則(DIP)、接口隔離原則(ISP)、迪米特法則(LoD)。這些原則是構建靈活、可擴展、易維護系統的基礎。理解并應用這些原則,可以有效降低系統耦合度,提升代碼質量。
2. 依賴倒置原則(DIP)
2.1 定義與背景
依賴倒置原則(Dependency Inversion Principle, DIP)要求高層模塊不應該依賴低層模塊,二者都應該依賴其抽象。抽象不應該依賴細節,細節應該依賴抽象。通過依賴抽象而非具體實現,可以讓系統更加靈活和可擴展。
2.2 應用場景
DIP常用于分層架構中,如業務層與數據層的解耦。依賴注入和IoC容器的廣泛應用,也是DIP的體現。插件式架構、可插拔模塊等也都依賴于依賴倒置原則來實現靈活擴展。
2.3 代碼示例
// 不符合DIP的寫法
public class OrderService {private MySQLOrderRepository repository = new MySQLOrderRepository(); // 直接依賴具體實現,違反DIPpublic void createOrder(Order order) {// 業務邏輯System.out.println("創建訂單: " + order.getId());repository.save(order);}
}
class MySQLOrderRepository {public void save(Order order) {System.out.println("[MySQL] 保存訂單: " + order.getId());}
}
class Order {private String id;public Order(String id) { this.id = id; }public String getId() { return id; }
}
// 使用示例
public class Main {public static void main(String[] args) {OrderService service = new OrderService();service.createOrder(new Order("A1001"));}
}// 符合DIP的寫法
// 訂單倉儲接口,定義抽象
public interface OrderRepository {void save(Order order);
}
// MySQL實現,依賴于抽象
public class MySQLOrderRepository implements OrderRepository {