- 在軟件開(kāi)發(fā)中蹬屹,為了提高軟件系統(tǒng)的可維護(hù)性和可復(fù)用性,增加軟件的可擴(kuò)展性和靈活性卸留,程序員要盡量根據(jù)7條原則來(lái)開(kāi)發(fā)程序走越,從而提高軟件的開(kāi)發(fā)效率,節(jié)約軟件開(kāi)發(fā)成本和維護(hù)成本耻瑟,我們將在下面的幾節(jié)中依次來(lái)介紹者7條原則旨指,本節(jié)介紹里依賴(lài)倒置原則
依賴(lài)倒置原則的定義
是Object Mentor 公司總裁羅伯特·馬渡退帧(Robert C·Martin)于1996年在C++ Report 上發(fā)表的文章。
依賴(lài)倒置原則原定義:高層模塊不應(yīng)該依賴(lài)底層模塊谆构,兩者應(yīng)該依賴(lài)其抽象裸扶;抽象不應(yīng)該依賴(lài)細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)抽象(High lebel modules shoulenot depend upon low level modules.Both should depend upon.Abstractions should not depend upon details. Details should depend upon adstractions).
軟件設(shè)計(jì)中,細(xì)節(jié)往往多聚變化熬尺,而抽象層先對(duì)穩(wěn)定摸屠,所以要以抽象層為基礎(chǔ)搭建框架,抽象層一般會(huì)暴露接口或定義為抽象類(lèi)猪杭,細(xì)節(jié)類(lèi)實(shí)現(xiàn)/繼承抽象層完成細(xì)節(jié)邏輯餐塘。
接口和抽象類(lèi)是指定規(guī)范和契約,不涉及具體業(yè)務(wù)皂吮,具體業(yè)務(wù)有細(xì)節(jié)實(shí)現(xiàn)類(lèi)去完成戒傻。
依賴(lài)倒置原則 作用
1.降低類(lèi)間的耦合性
2.提高系統(tǒng)穩(wěn)定性
3.減少并行開(kāi)發(fā)引起的風(fēng)險(xiǎn)
4.提高代碼的可讀性和可維護(hù)性
依賴(lài)倒置原則 實(shí)現(xiàn)方法
- 每個(gè)類(lèi)盡量提供接口或抽象類(lèi),或者兩者都具備
- 變量的聲明類(lèi)型盡量使接口/抽象類(lèi)
- 任何類(lèi)都不應(yīng)該從具體類(lèi)派生(從1.中派生)
- 使用繼承時(shí)盡量遵循里氏替換原則
【例】依賴(lài)倒置原則“顧客購(gòu)物程序”應(yīng)用
分析:”顧客類(lèi)“和“商店類(lèi)”的關(guān)系蜂筹。商店類(lèi)中有sell()方法需纳,顧客類(lèi)通過(guò)此方法定義購(gòu)物。
//商店Xxx 有銷(xiāo)售方法
class Customer{
public void shopping(XxxShop shop){
//購(gòu)物
System.out.println(shop.sell());
}
}
//商店Sss 也有銷(xiāo)售方法
class Customer{
public void shopping(SssShop shop){
//購(gòu)物
System.out.println(shop.sell());
}
}
//可以定義一個(gè)Shop類(lèi) 讓Sss Xxx 繼承或?qū)崿F(xiàn) 就都具備shell 方法
class Customer {
public void shopping(Shop shop) {
//購(gòu)物
System.out.println(shop.sell());
}
}
實(shí)現(xiàn)代碼
package principle;
public class DIPtest {
public static void main(String[] args) {
Customer wang = new Customer();
System.out.println("顧客購(gòu)買(mǎi)以下商品:");
wang.shopping(new SssShop ());
wang.shopping(new XxxShop ());
}
}
//商店
interface Shop {
public String sell(); //賣(mài)
}
//韶關(guān)網(wǎng)店
class SssShop implements Shop {
public String sell() {
return "Sss土特產(chǎn):香菇艺挪、木耳……";
}
}
//婺源網(wǎng)店
class XxxShop implements Shop {
public String sell() {
return "Xxx土特產(chǎn):綠茶不翩、酒糟魚(yú)……";
}
}
//顧客
class Customer {
public void shopping(Shop shop) {
//購(gòu)物
System.out.println(shop.sell());
}
}