0 概述
依賴倒置原則(Dependence Inversion Principle)是程序要依賴於抽象接口,不要依賴於具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。來源百度百科
1 依賴倒置理解
A調用B,A對B有依賴,這叫正向依賴。我們一個應用中,應用層會調用基礎設施層,這個時候應用層就強依賴基礎設施層。寫代碼順序是先寫基礎設施層再寫應用層。如下面代碼片段,一個根據訂單查詢服務,OrderQueryServiceImpl 在應用層,Orderepository 在基礎設置層;那麼依賴關係就是應用依賴基礎設置層,依賴導致方法,就是應用層定義好Orderepository接口,讓基礎設施層去實現;應用層只依賴接口,這個就依賴倒置。這麼設計的好處是什麼呢?未來基礎設施有什麼變化應用層不感知這個變化,同時和基礎設施層解耦了。spring 容器 實現依賴注入,所依賴的對象直接由 IoC 容器創建後注入到被注入的對象中,依賴的對象由原來的主動獲取變成被動接受,所以是反轉。
public interface OrderQueryService {
/**
* 根據訂單Id查詢訂單
*/
Result<OrderDTO> getOrder(String orderId);
}
public class OrderQueryServiceImpl implements OrderQueryService {
@Resource
private Orderepository orderepository;
@Override
public Result<OrderDTO> getOrder(String orderId) {
//校驗
//查詢
OrderDO orderDO= orderepository.getOrder(orderId);
//轉換
return Result.succ();
}
}
下面再看下面這個例子,Person依賴了Vehicle這個是正向依賴,那麼如何實現人類和汽車解耦呢?那麼就是搶奪接口的控制權,即人類搶到drive控制權,人類具有駕駛的能力,這個時候Person 和Vehicle 就解耦了。
//車輛
public interface Vehicle {
}
// 卡車
public class Truck implements Vehicle {
}
//小汽車
public class Car implements Vehicle {
}
// 人類駕駛交通工具
public interface Person {
void drive(Vehicle vehicle);
}
// 下面依賴倒置,解耦做法
public interface Driveable {
}
// 小汽車實現了人類接口
public class Car implements Vehicle , Driveable{
}
public interface Person {
void drive(Driveable driveable);
}
參考文獻
[1]https://www.cnblogs.com/chenssy/p/9576769.html