六大設計原則之DIP
阿新 • • 發佈:2018-12-15
目錄
1.簡介
依賴倒置原則(Dependence Inversion Principle),簡稱DIP。
2.定義
高層模組不應該依賴於低層模組,兩者都應該依賴其抽象。抽象不應該依賴細節。細節應該依賴抽象。這裡的低層模組就是不可分割的原子邏輯,原子邏輯再組裝就成了高階模組。抽象是指介面或者抽象類,兩者都是不能直接被例項化;細節就是實現類,實現介面或繼承抽象類而產生的類,可以直接被直接例項化。所謂的能否直接例項化也就在於是否可以通過關鍵字new產生的一個物件。簡單來說就是模組之間的依賴都是通過抽象發生,實現類之間並不直接產生依賴關係,其依賴關係都是通過介面或者抽象類產生的。實現類依賴介面或抽象類,但介面或抽象類不依賴實現類。這也正好對應面向介面程式設計。
3.依賴
傳說中的實現方式有三種,且聽我一一道來。假設存在兩個介面IFace1和IFce2,IFace1的實現類依賴IFace2。
3.1 建構函式傳遞依賴物件
public interface IFace1{ public void method1(); } public interface IFace2{ public void method2(); } public class face1 implements IFace1{ private IFace2 face2; public face1(IFace2 face2) { this.face2 = face2; } public void method1() { this.face2.method2(); } }
3.2 Setter方法傳遞依賴物件
public interface IFace1{ public void method1(); } public interface IFace2{ public void method2(); } public class face1 implements IFace1{ private IFace2 face2; public void setFace2(IFace2 face2) { this.face2 = face2; } public void method1() { this.face2.method2(); } }
3.3 介面宣告依賴物件
public interface IFace1{
public void method1();
}
public interface IFace2{
public void method2();
}
public class face1 implements IFace1{
public void method1(IFace2 face2) {
face2.method2();
}
}
4.舉例
想必大家都看過水滸傳吧,其中有一人身上刺滿一身青龍,刀槍劍戟十八班武藝樣樣精通,江湖人稱九龍紋龍史進是也。
public interface IWupo {
public void martialArts(IWeapon weapon);
}
public interface IWeapon {
public void attack();
}
public class Wupo implements IWupo {
public void martialArts(IWeapon weapon) {
weapon.attack();
}
}
public class Sword implements IWeapon {
public void attack() {
System.out.println("看我獨孤九劍");
}
}
public class Stick implements IWeapon {
public void attack() {
System.out.println("打狗棍法,看棍");
}
}
public class Shuifu {
public static void main(String[] args) {
IWupo shiJin = new Wupo();
IWeapon sword = new Sword();
shiJin.martialArts(sword);
}
}
這樣,如果史進不想用劍了,改用其他兵器,我們可以只對高層模組進行修改
public class Shuifu {
public static void main(String[] args) {
IWupo shiJin = new Wupo();
IWeapon stick = new Stick();
shiJin.martialArts(stick);
}
}
這便是DIP的核心,面向介面程式設計。