設計模式七大原則之依賴倒轉

什麼是依賴倒轉原則?

依賴倒轉原則是基於這樣的理念: 相對於細節的多變性, 抽象的東西要穩定的多。以抽象爲基礎搭建的架構比以細節爲基礎的架構要穩定的多。在java中, 抽象值得是接口或抽象類,細節就是具體的實現類。其核心的思想就是面向接口編程
應當遵循高層模塊不應該依賴底層模塊, 二者都應該是依賴其抽象。
抽象不應該依賴細節,細節應該依賴於抽象。

爲什麼要設計依賴倒轉原則?

(1) 制定規範
(2) 利於程序擴展和優化
(3) 代碼閱讀性更強

案例演示01 - 非依賴倒轉

有一個Person類,其中有一個用來接收信息的receive()方法
public class Normal {
    public static void main(String[] args) {
        /***
         * 沒有使用依賴倒轉原則,方案比較簡單
         * 此處只有一個信息來源就是郵件,那麼後續如果有更多的其他信息來源,例如: 微信、短信、QQ等。則新增類時,同時Person也需要跟着改變,
         * 增加相應的接收方法。
         */
        Person person = new Person();
        person.receive(new Email());
    }
}

class Person {
    public void receive(Email email) {
        email.getInfo();
    }
}

class Email {
    public String getInfo() {
        return "電子郵件消息: test";
    }
}
這種方案沒有采用依賴倒轉,模式比較簡單。但是不利於後期程序的擴展。因爲目前只有一種信息來源就是郵件, 假設後期有多種信息來源,例如: 微信、短信、QQ等。那麼就要對於Person類增加相對應的代碼,從而導致代碼變得冗長,可讀性和維護性都會降低

案例演示02 - 依賴倒轉

我們可以基於多種信息來源的方式抽象一個接口出來,在接口中定義一個getInfo() 方法。具體的信息來源類都實現這個接口。在需要獲取信息的時候依賴於接口,這樣既有利於代碼的擴展性,也同時使用到了依賴倒轉原則
public class DepencyVersion {
    public static void main(String[] args) {
        Person person = new Person();
        person.getInfo(new Wechat());
        person.getInfo(new QQ());
        person.getInfo(new Sms());
        person.getInfo(new Email());
    }
}


class Person {
    public void getInfo(IReceiver receiver) {
        System.out.println(receiver.getInfo());
    }
}

/***
 * 所有信息來源需要實現的接口
 */
interface IReceiver {
    String getInfo();
}

class Wechat implements IReceiver {
    @Override
    public String getInfo() {
        return "微信消息: test";
    }
}

class QQ implements IReceiver {
    @Override
    public String getInfo() {
        return "QQ消息: test";
    }
}

class Sms implements IReceiver {
    @Override
    public String getInfo() {
        return "短信消息: test";
    }
}

class Email implements IReceiver {
    @Override
    public String getInfo() {
        return "郵件消息: test";
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章