JAVA中的依賴倒原則
美國法律有一條最基本的準則就是“人人平等”,我們不去管它是經過什麼樣的鬥爭、什麼樣的流血犧牲換來的,只把它理解為一個JAVA方法,該方法定義如下:
public final boolean 人人平等(人1,人2){
return true;
}
雖然各州的法律有可能不同,如美國基本法,紐約有可能叫紐約基本法,他們應該是這樣一種關係:紐約基本法繼承美國基本法,但是不允許對該方法進行重寫。
在紐約執行法很的時候,採用:
美國基本法= new 紐約基本法
任何地方調用"人人平等"這個方法,都是返回"true",也就是人人平等的原則在任何地方都不可能被改變,這是宏觀決定微觀,而不會因為紐約而變成男人與女人的不相等。
如某國也有基本法,也有人平等的方法。定義應該如下:
public boolean 人人平等(人1,人2){
return true;
}
如某國的某地也有基本法,某地基本法也是繼承於某國基本法,但是因為"人人平等"這個方法不是final類型的,因而可能被改寫,某地執行的時候,可能採用:
某國基本法= new 某地基本法
或
某地基本法= new 某地基本法
說不定某地基本法中在繼承某國基本法的時候,就將"人人平等"這個方法給重寫了,改成了:
public boolean 人人平等(人1,人2){
if(人1==某地人&& 人2==某地人){
if(人1與人2屬性於同一階層){
if(人1與人2除了不是同一個人基它都相同){
if(無人為其它情況發生){
return true;
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}
再來說說依賴倒轉原則,根據《JAVA與模式》中的說的:
抽象層次包含的是應用系統的商務邏輯和宏觀的、對整個系統來說重要的策略性決定,是必然性的體現;而具體層次則含有一些次要的與實現有關的演算法和邏輯,以及戰術性的決定,帶有相當大的偶然性選擇。具體層次的程式碼是會經常有變動的,不能避免出現錯誤。抽象層次依賴於具體層次,使用具體層次的細節的演算法變化立即影響到抽象層次的宏觀的商務邏輯,導致微觀決定宏觀,戰術決定戰略,偶然決定必然,這是很荒唐的事情。
看了這個也就知道為什麼以後寫程式的時候,多用用:
抽象邏輯= new 具體邏輯
盡量少用:
具體邏輯= new 具體邏輯
這個也就是現在比較提倡的面向介面編程,再舉一個面向介面編程比較實用的例子:
平常用List應該比較多,List本身就是一個繼承於Collection的接口,可以這樣用:
List list=new Vector();
這樣宣告的這個List其實是一個Vector型,因為Vector是其子類,根據里氏代換原則,能夠接受父類的地方,都可以接受子類。此時的List是同步的,當然也因此會受到一定的效能影響了。如果以後換了一個不需要同步的環境,只需要將以上程式碼改為如:
List list=new ArrayList();
其它的任何程式碼都不需要修改,此時的List的實際類型就為ArrayList了。
從此一點,可以看出面向接口編程為什麼是設計人員的珍愛了,因為他們提供了接口之後,實施人員根據該接口去實現具體類,就不擔心實施人員破壞原有程序的完整性,設計人員永遠只關心介面中的方法,具體類別中的輔助方法不用去擔心。但這是透過額外的代價換來的,如增加JAVA類等,如果抽象類別能夠帶來較少的效率,採用具體耦合反而是更好的選擇,如工具類。