(三) 依賴倒置(DIP-Denpendence Inversion Princle)
1. 概念:通俗來講就是面向接口的程式設計
(1)高層子產品兒(原子邏輯的再組裝)不應該依賴于低層子產品兒(不可分割的原子邏輯),二者都應該依賴于其抽象(在java語言中就是抽象類或是接口,二者都不可執行個體化);
(2)抽象不應該依賴于細節(java中表現為實作類,可被執行個體化);
(3)細節應該依賴抽象
2. 示例:一個簡單的司機開車的場景,其類圖如3-1所示,這三個簡單的類,其中Client屬于高層子產品兒,Driver和Benz都屬于低層子產品兒,三者都屬于實作類。設計的好壞在于是否能夠有效的應付變化,如果換一輛寶馬,司機是否還能繼續開呢?由于Driver依賴于具體的Benz類,是以無法進行有效的變化,如果引入依賴倒置原則,則可變為圖3-2,将具體的Driver和Car進行了解耦。
圖3-1司機開奔馳 圖3-2司機開好多車
3.示例引申:對象的依賴關系有三種方式來進行傳遞:
a.構造函數依賴
public interface IDriver{
//是司機就會駕車
public void drive();
}
public class Driver implements IDriver{
private ICar car;
public Driver(ICar car){
this.car=car;
}
public void run(){
this.car.run();
}
}
b.Setter依賴
public interface IDriver{
//車輛型号
public void setCar(ICar car);
public void drive();
}
public Driver implements IDriver{
private ICar car;
public void setCar(ICar car){
this.car=car;
}
public void drive{
this.car.run();
}
}
C.接口申明依賴,也叫做接口注入;如圖3-2所示
4.最佳實踐:;
每個類盡量都有接口或抽象類,或者二者都具備;
變量的表面類型盡量是接口或者抽象類;
任何類都不應該從具體類派生(不超過兩層的繼承可以忍受,但項目維護工作可以除外);
盡量不要覆寫基類(抽象類)的方法;
結合裡氏替換原則使用;
接口負責定義public屬性和方法,并且聲明與其他對象的依賴關系,抽象類負責公共構造部分的實作,實作類準确的實作業務邏輯,同時在适當的時候對父類進行細化