黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

面向對象設計原則

依賴倒置原則

前兩節我們詳細介紹了面向對象設計原則中的開閉原則和里氏替換原則,在本節中我們來介紹依賴倒置原則。

依賴倒置原則的定義

依賴倒置原則(Dependence Inversion Principle,DIP)是 Object Mentor 公司總裁羅伯特·馬丁(Robert C.Martin)于 1996 年在 C++ Report 上發表的文章。

依賴倒置原則的原始定義為:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口編程,不要面向實現編程。

依賴倒置原則是實現開閉原則的重要途徑之一,它降低了客戶與實現模塊之間的耦合。

由于在軟件設計中,細節具有多變性,而抽象層則相對穩定,因此以抽象為基礎搭建起來的架構要比以細節為基礎搭建起來的架構要穩定得多。這里的抽象指的是接口或者抽象類,而細節是指具體的實現類。

使用接口或者抽象類的目的是制定好規范和契約,而不去涉及任何具體的操作,把展現細節的任務交給它們的實現類去完成。

依賴、倒置原則的作用

依賴倒置原則的主要作用如下。

• 依賴倒置原則可以降低類間的耦合性。

• 依賴倒置原則可以提高系統的穩定性。

• 依賴倒置原則可以減少并行開發引起的風險。

• 依賴倒置原則可以提高代碼的可讀性和可維護性。

依賴倒置原則的實現方法

依賴倒置原則的目的是通過要面向接口的編程來降低類間的耦合性,所以我們在實際編程中只要遵循以下4點,就能在項目中滿足這個規則。

1、每個類盡量提供接口或抽象類,或者兩者都具備。

2、變量的聲明類型盡量是接口或者是抽象類。

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

4、使用繼承時盡量遵循里氏替換原則。

下面以“顧客購物程序”為例來說明依賴倒置原則的應用。

【例1】依賴倒置原則在“顧客購物程序”中的應用。

分析:本程序反映了 “顧客類”與“商店類”的關系。商店類中有 sell() 方法,顧客類通過該方法購物以下代碼定義了顧客類通過韶關網店 ShaoguanShop 購物:

class Customer
{
    public void shopping(ShaoguanShop shop)
    {
        //購物
        System.out.println(shop.sell());
    }
}

但是,這種設計存在缺點,如果該顧客想從另外一家商店(如婺源網店 WuyuanShop)購物,就要將該顧客的代碼修改如下:

class Customer
{
    public void shopping(WuyuanShop shop)
    {
        //購物
        System.out.println(shop.sell());
    }
}

顧客每更換一家商店,都要修改一次代碼,這明顯違背了開閉原則。存在以上缺點的原因是:顧客類設計時同具體的商店類綁定了,這違背了依賴倒置原則。解決方法是:定義“婺源網店”和“韶關網店”的共同接口 Shop,顧客類面向該接口編程,其代碼修改如下:

class Customer
{
    public void shopping(Shop shop)
    {
        //購物
        System.out.println(shop.sell());
    }
}

這樣,不管顧客類 Customer 訪問什么商店,或者增加新的商店,都不需要修改原有代碼了,其類圖如圖 1 所示。

圖1 顧客購物程序的類圖

程序代碼如下:

package principle;
public class DIPtest
{
    public static void main(String[] args)
    {
        Customer wang=new Customer();
        System.out.println("顧客購買以下商品:"); 
        wang.shopping(new ShaoguanShop()); 
        wang.shopping(new WuyuanShop());
    }
}
//商店
interface Shop
{
    public String sell(); //賣
}
//韶關網店
class ShaoguanShop implements Shop
{
    public String sell()
    {
        return "韶關土特產:香菇、木耳……"; 
    } 
}
//婺源網店
class WuyuanShop implements Shop
{
    public String sell()
    {
        return "婺源土特產:綠茶、酒糟魚……"; 
    }
} 
//顧客
class Customer
{
    public void shopping(Shop shop)
    {
        //購物
        System.out.println(shop.sell()); 
    }
}

程序的運行結果如下:

顧客購買以下商品:
韶關土特產:香菇、木耳……
婺源土特產:綠茶、酒糟魚……

 

全部教程
主站蜘蛛池模板: 久久精品免费观看 | 亚洲国产成人成上人色 | 成人国产一区二区三区精品 | 欧美视频在线观看一区 | 美女黄站| 日批视频在线 | 亚洲国产欧美在线不卡中文 | 欧美成人综合 | a级午夜毛片免费一区二区 a级午夜理论免费毛片 | 激情免费视频 | 中文字幕视频二区 | 高h激h奶汁双性文1v1 | 色视频在线 | 夜夜骑狠狠干 | 在线播放精品 | 日本无遮挡亲吻膜下面免费 | 免费黄色看片网站 | 日韩激情文学 | 色迷迷网免费站视频在线观看 | 国内一级一级毛片a免费 | 伊人五月婷婷 | 国产午夜在线观看 | 一级片一级毛片 | 黄色在线视频免费 | 两个人看的www中文字幕 | 黄色在线观看视频免费 | 日韩欧美一及在线播放 | 波多野结衣国产一区二区三区 | 成年视频网站免费观看 | 狠狠躁夜夜躁人人爽天天 | 一个人看的手机视频www | 人人爽天天爽夜夜爽曰 | 日韩精品在线第一页 | 女攻男受高h全文肉肉 | xxxx日本在线播放免费不卡 | 免费韩国伦理片在线观看 | 午夜视频在线 | 日本高清一区二区三区不卡免费 | 亚洲另类第一页 | 亚洲视频欧洲视频 | 456亚洲人成在线播放网站 |