Dependence Inversion Principle ”依賴倒置原則
說明: 要依賴于抽象,不要依賴于具體。客戶端依賴于抽象耦合。
抽象不應(yīng)當(dāng)依賴于細(xì)節(jié);細(xì)節(jié)應(yīng)當(dāng)依賴于抽象;
要針對接口編程,不針對實(shí)現(xiàn)編程。
優(yōu)點(diǎn): 使用傳統(tǒng)過程化程序設(shè)計(jì)所創(chuàng)建的依賴關(guān)系,策略依賴于細(xì)節(jié),這是糟糕的,因?yàn)椴呗允艿郊?xì)節(jié)改變的影響。依賴倒置原則使細(xì)節(jié)和策略都依賴于抽象,抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性。
怎樣做到依賴倒置?
以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。抽象耦合關(guān)系總要涉及具體類從抽象類繼承,并且需要保證在任何引用到基類的地方都可以改換成其子類,因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。
在抽象層次上的耦合雖然有靈活性,但也帶來了額外的復(fù)雜性,如果一個(gè)具體類發(fā)生變化的可能性非常小,那么抽象耦合能發(fā)揮的好處便十分有限,這時(shí)可以用具體耦合反而會(huì)更好。
層次化:所有結(jié)構(gòu)良好的面向?qū)ο髽?gòu)架都具有清晰的層次定義,每個(gè)層次通過一個(gè)定義良好的、受控的接口向外提供一組內(nèi)聚的服務(wù)。
依賴于抽象:建議不依賴于具體類,即程序中所有的依賴關(guān)系都應(yīng)該終止于抽象類或者接口。盡量做到:
1 、任何變量都不應(yīng)該持有一個(gè)指向具體類的指針或者引用。
2 、任何類都不應(yīng)該從具體類派生。
3 、任何方法都不應(yīng)該覆寫它的任何基類中的已經(jīng)實(shí)現(xiàn)的方法。
上面所敘述的只是一些理論性的東西,下面舉個(gè)例子或許能更好地說明問題,
首先假設(shè)有一個(gè)需求,類Business需要調(diào)用類Dependency的方法f(),按照日常的做法,得到下面的代碼:
//**類Dependency**
public class Dependency {
????public void f() {};
}
//**類Business**
public??class Business {
????Dependency d;
????public Business() {
????d = new Dependency();
????}
????public void doSth() {
????????d.f();
????}
}
對上述實(shí)現(xiàn)做出如下修改:
????首先,將Business里的Dependency實(shí)例的獲得該為setter方式,其次,將Dependency類改為某個(gè)接口的實(shí)現(xiàn)。故可以得到下面新的代碼:
//**接口IDependency**
public interface IDependency {
????void f();
}
//**類Dependency**
public class Dependency {
????public void f() {};
}
//**類Business**
public??class Business {
????IDependency d;????????????//如果在構(gòu)造函數(shù)里new一個(gè)具體的類的話,那么這段代碼還是不能復(fù)用,一些書上在這個(gè)類中的某個(gè)函數(shù)中new一個(gè)具體的類,當(dāng)然
????public Business() {}??????//在具體類發(fā)生變化的時(shí)候,這段代碼還得改,還是不能復(fù)用,高層還是依賴于具體,所以對讀者是一種誤解。所以應(yīng)該采取依賴注
????public void doSth() {?????//的方法,讓外界來決定什么時(shí)候來傳入一個(gè)具體的類,這就是好萊蕪原則,只要具體類實(shí)現(xiàn)了某個(gè)穩(wěn)定的接口,那么這個(gè)類
???? d.f();???????????????????//Business就能在以后的開發(fā)中得到復(fù)用,所以不只是繼承才能復(fù)用,繼承只是比較狹隘的復(fù)用,面向?qū)ο蟮膹?fù)用強(qiáng)調(diào)的是邏輯的
????}?????????????????????????//復(fù)用,只有這樣才能在開發(fā)中節(jié)省大量的人力。所以依賴倒置應(yīng)該于依賴注入聯(lián)系起來,不能分離使用(個(gè)人看法)。
????public void setDependency(IDependency d) {
????????this.d = d;
????}
}
在新的代碼中,首先Business的變量d可以接收任何IDependency的實(shí)例,另外,Dependency的實(shí)例不是通過Business來獲得,而是通過setter(也可以用構(gòu)造器)來由外部傳給它。這似乎跟我們往常的代碼沒什么不同,但這已經(jīng)是一個(gè)良好的設(shè)計(jì)。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
