第8章 依賴倒轉原則(DIP)
依賴倒轉原則:要依賴于抽象,不要依賴于具體。
8.3 依賴倒轉原則
三種耦合關系:
1)零耦合
2)具體耦合:發生在兩個具體的(可實例化的)類之間。
3)抽象耦合:發生在一個具體類和一個抽象類(或者Java接口)之間。
what?
抽象不應當依賴于細節;細節應當依賴于抽象。
另一種表述:
要針對接口編程,不要針對實現編程。
一個具體Java類應當只實現Java接口和抽象Java類中聲明過的方法,而不應當給出多余的方法。
變量的靜態類型:變量被聲明時的類型。
變量的真實類型:變量所引用的對象的真實類型。
引用對象的抽象類型
在很多情況下,一個Java程序需要引用一個對象。這個時候,如果這個對象有一個抽象類型的話,應當使用這個抽象類型作為
變量的靜態類型。這就是
針對接口編程的含義。
例如:蛋 x = new 雞();
而非:雞 x = new 雞();
List employees = new Vector();
而非:Vector employees = new Vector();
8.4 how?
工廠方法模式
*模版方法模式
*迭代子模式
*
8.5 Java對抽象類型的支持
Java接口與Java抽象類的區別:
1)Java抽象類可以提供某些方法的部分實現,而Java接口則不可以。
2)一個抽象類的實現只能由這個抽象類的子類給出;任何一個實現了一個Java接口所規定的方法的類都可以具有這個接口的類型,而一個類可以實現任意多個Java接口。
3)從代碼重構的角度上講,將一個單獨的Java具體類重構成一個Java接口的實現是很容易的;而為一個已有的具體類添加一個Java抽象類作為抽象類型卻不那么容易,因為這個具體類有可能已經有一個超類。
4)Java接口是定義混合類型的理想工具。
聯合使用Java接口和Java抽象類
缺省適配模式
8.8 優缺點
不容易實現;
假定所有的具體類都是會變化的。