1. 程式人生 > >六大設計原則之DIP

六大設計原則之DIP

目錄

1.簡介

2.定義

3.依賴

4.舉例

1.簡介

依賴倒置原則(Dependence Inversion Principle),簡稱DIP。

2.定義

高層模組不應該依賴於低層模組,兩者都應該依賴其抽象。抽象不應該依賴細節。細節應該依賴抽象。這裡的低層模組就是不可分割的原子邏輯,原子邏輯再組裝就成了高階模組。抽象是指介面或者抽象類,兩者都是不能直接被例項化;細節就是實現類,實現介面或繼承抽象類而產生的類,可以直接被直接例項化。所謂的能否直接例項化也就在於是否可以通過關鍵字new產生的一個物件。簡單來說就是模組之間的依賴都是通過抽象發生,實現類之間並不直接產生依賴關係,其依賴關係都是通過介面或者抽象類產生的。實現類依賴介面或抽象類,但介面或抽象類不依賴實現類。這也正好對應面向介面程式設計。

3.依賴

傳說中的實現方式有三種,且聽我一一道來。假設存在兩個介面IFace1和IFce2,IFace1的實現類依賴IFace2。

3.1 建構函式傳遞依賴物件

public interface IFace1{
    public void method1();
}

public interface IFace2{
    public void method2();
}

public class face1 implements IFace1{
    private IFace2 face2;

    public face1(IFace2 face2) {
        this.face2 = face2;
    }

    public void method1() {
        this.face2.method2();
    }
}

3.2 Setter方法傳遞依賴物件

public interface IFace1{
    public void method1();
}

public interface IFace2{
    public void method2();
}

public class face1 implements IFace1{
    private IFace2 face2;

    public void setFace2(IFace2 face2) {
        this.face2 = face2;
    }

    public void method1() {
        this.face2.method2();
    }
}

3.3 介面宣告依賴物件

public interface IFace1{
    public void method1();
}

public interface IFace2{
    public void method2();
}

public class face1 implements IFace1{
    public void method1(IFace2 face2) {
        face2.method2();
    }
}

4.舉例

想必大家都看過水滸傳吧,其中有一人身上刺滿一身青龍,刀槍劍戟十八班武藝樣樣精通,江湖人稱九龍紋龍史進是也。

public interface IWupo {
    public void martialArts(IWeapon weapon);
}

public interface IWeapon {
    public void attack();
}

public class Wupo implements IWupo {
    public void martialArts(IWeapon weapon) {
        weapon.attack();
    }
}

public class Sword implements IWeapon {
    public void attack() {
        System.out.println("看我獨孤九劍");
    }
}

public class Stick implements IWeapon {
    public void attack() {
        System.out.println("打狗棍法,看棍");
    }
}

public class Shuifu {
    public static void main(String[] args) {
        IWupo shiJin = new Wupo();
        IWeapon sword = new Sword();
        shiJin.martialArts(sword);
    }
}

這樣,如果史進不想用劍了,改用其他兵器,我們可以只對高層模組進行修改

public class Shuifu {
    public static void main(String[] args) {
        IWupo shiJin = new Wupo();
        IWeapon stick = new Stick();
        shiJin.martialArts(stick);
    }
}

這便是DIP的核心,面向介面程式設計。