日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

依賴倒置

系統 2390 0

Dependence Inversion Principle ”依賴倒置原則

說明: 要依賴于抽象,不要依賴于具體。客戶端依賴于抽象耦合。

抽象不應當依賴于細節;細節應當依賴于抽象;

要針對接口編程,不針對實現編程。

優點: 使用傳統過程化程序設計所創建的依賴關系,策略依賴于細節,這是糟糕的,因為策略受到細節改變的影響。依賴倒置原則使細節和策略都依賴于抽象,抽象的穩定性決定了系統的穩定性。

怎樣做到依賴倒置?

以抽象方式耦合是依賴倒轉原則的關鍵。抽象耦合關系總要涉及具體類從抽象類繼承,并且需要保證在任何引用到基類的地方都可以改換成其子類,因此,里氏代換原則是依賴倒轉原則的基礎。

在抽象層次上的耦合雖然有靈活性,但也帶來了額外的復雜性,如果一個具體類發生變化的可能性非常小,那么抽象耦合能發揮的好處便十分有限,這時可以用具體耦合反而會更好。

層次化:所有結構良好的面向對象構架都具有清晰的層次定義,每個層次通過一個定義良好的、受控的接口向外提供一組內聚的服務。

依賴于抽象:建議不依賴于具體類,即程序中所有的依賴關系都應該終止于抽象類或者接口。盡量做到:

1 、任何變量都不應該持有一個指向具體類的指針或者引用。

2 、任何類都不應該從具體類派生。

3 、任何方法都不應該覆寫它的任何基類中的已經實現的方法。

上面所敘述的只是一些理論性的東西,下面舉個例子或許能更好地說明問題,

首先假設有一個需求,類Business需要調用類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();
????}
}

對上述實現做出如下修改:
????首先,將Business里的Dependency實例的獲得該為setter方式,其次,將Dependency類改為某個接口的實現。故可以得到下面新的代碼:
//**接口IDependency**
public interface IDependency {
????void f();
}
//**類Dependency**
public class Dependency {
????public void f() {};
}
//**類Business**
public??class Business {
????IDependency d;????????????//如果在構造函數里new一個具體的類的話,那么這段代碼還是不能復用,一些書上在這個類中的某個函數中new一個具體的類,當然
????public Business() {}??????//在具體類發生變化的時候,這段代碼還得改,還是不能復用,高層還是依賴于具體,所以對讀者是一種誤解。所以應該采取依賴注
????public void doSth() {?????//的方法,讓外界來決定什么時候來傳入一個具體的類,這就是好萊蕪原則,只要具體類實現了某個穩定的接口,那么這個類
???? d.f();???????????????????//Business就能在以后的開發中得到復用,所以不只是繼承才能復用,繼承只是比較狹隘的復用,面向對象的復用強調的是邏輯的
????}?????????????????????????//復用,只有這樣才能在開發中節省大量的人力。所以依賴倒置應該于依賴注入聯系起來,不能分離使用(個人看法)。
????public void setDependency(IDependency d) {
????????this.d = d;
????}
}

在新的代碼中,首先Business的變量d可以接收任何IDependency的實例,另外,Dependency的實例不是通過Business來獲得,而是通過setter(也可以用構造器)來由外部傳給它。這似乎跟我們往常的代碼沒什么不同,但這已經是一個良好的設計。

?

依賴倒置


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 那曲县| 宜川县| 宜城市| 巴彦淖尔市| 抚顺县| 周至县| 鄂伦春自治旗| 定西市| 芦山县| 平凉市| 上蔡县| 湖州市| 城市| 武夷山市| 神木县| 齐齐哈尔市| 茶陵县| 东城区| 凤凰县| 兰溪市| 兴海县| 泾源县| 武功县| 肥乡县| 奉贤区| 慈溪市| 凌源市| 普兰店市| 灵台县| 遵义县| 武功县| 扶沟县| 高要市| 临洮县| 宁国市| 广安市| 临清市| 建瓯市| 黔南| 余江县| 保康县|