程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 設計模式--6大原則--依賴倒置原則

設計模式--6大原則--依賴倒置原則

編輯:C++入門知識

依賴倒置原則(Dependence Inversion Principle),簡稱DIP
定義
High level modules should depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.
即
1、高層模塊不應該依賴低層模塊,兩者都應該依賴於抽象(抽象類或接口)
2、抽象(抽象類或接口)不應該依賴於細節(具體實現類)
3、細節(具體實現類)應該依賴抽象
 
抽象:即抽象類或接口,兩者是不能夠實例化的
細節:即具體的實現類,實現接口或者繼承抽象類所產生的類,兩者可以通過關鍵字new直接被實例化
 
而依賴倒置原則的本質騎士就是通過抽象(抽象類或接口)使各個類或模塊的實現彼此獨立,不相互影響,實現模塊間的松耦合。但是這個原則也是6個設計原則中最難以實現的了,如果沒有實現這個原則,那麼也就意味著開閉原則(對擴展開發,對修改關閉)也無法實現。
依賴倒置有三種方式來實現
1、通過構造函數傳遞依賴對象
比如在構造函數中的需要傳遞的參數是抽象類或接口的方式實現。
2、通過setter方法傳遞依賴對象
即在我們設置的setXXX方法中的參數為抽象類或接口,來實現傳遞依賴對象
3、接口聲明實現依賴對象
例如下面的例子
塗塗是個女僧

public class Tutu {
    //塗塗是個女孩,會煮面
    public void cook(Noodles noodles)
    {
        noodles.eat();
    }
}
面條(目前只會煮面)

public class Noodles {
    //吃面條
    public void eat()
    {
        System.out.println("塗塗吃面條...");
    }
}
塗塗坐在家裡吃面(場景類)

public class Home {
    public static void main(String args[])
    {
        Tutu tutu = new Tutu();
        Noodles food = new Noodles();
        tutu.cook(food);
    }
}
運行結果:塗塗吃面條...
 
但是這有個問題,塗塗只會做面條,不可能每次都吃面條吧,天天吃面吃死你,所以在上面的Tutu類中的cook方法中,如果塗塗會做其他吃的,那豈不是更好。於是她向家庭主婦邁進了一步,使用了依賴倒置原則。
也就是塗塗通過學習還可以焖米飯,炒鱿魚(雖然聽著不爽,但是很好吃),京醬肉絲啊等等。要想在代碼中實現,就需要實現兩個接口:ITutu和IFood

public interface ITutu {
    //這樣就會做很多飯菜了
    public void cook(IFood food);
}
實現類

public class Tutu implements ITutu {
 
    @Override
    public void cook(IFood food) {
        food.eat();
    }
 
}
食物接口

public interface IFood {
    public void eat();
}
這樣就為擴展留出了很大的空間,方面擴展其他的類。也不會對細節有變動。以後塗塗想吃什麼學一下就可以自己做了
實現面條

public class Noodles implements IFood {
 
    @Override
    public void eat() {
        System.out.println("塗塗吃面條...");
    }
 
}
實現米飯

public class Rice implements IFood {
 
    @Override
    public void eat() {
        System.out.println("塗塗吃米飯(終於吃上米飯了)...");
    }
}
場景類:塗塗在家裡開吃了,想吃什麼直接做就是了

public class Home {
    public static void main(String args[])
    {
        //接口使不能實例化滴
        ITutu tutu = new Tutu();
        //實例化米飯,塗塗可以吃米飯了
        IFood rice = new Rice();
        //吃面條
        //IFood noodles = new Noodles();
        tutu.cook(rice);
    }
}
這樣各個類或模塊的實現彼此獨立,不互相影響,實現了模塊間的松耦合。

 

作者 婁立軍
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved