聊聊軟件設(shè)計(jì)原則(二)依賴倒置原則(DIP)

?依賴倒置原則(Dependence Inversion Principle,DIP)是指設(shè)計(jì)代碼結(jié)構(gòu)時(shí),高層模塊不應(yīng)該依賴低層模塊,二者都該依賴其抽象。即抽象不該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。通過依賴倒置,可以減少類與類之間的耦合性,提高系統(tǒng)的穩(wěn)定性,提高代碼的可讀性和可維護(hù)性,同時(shí)能夠降低對(duì)系統(tǒng)修改時(shí)帶來的風(fēng)險(xiǎn)。
?好了暈車了對(duì)嘛,來看一段代碼。還是以之前的賣出去的書為例,創(chuàng)建一個(gè)類IRead:

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description 我愛讀書,讀書讓我快樂
 * @Date: Create in 10:22 2020/4/9
 */
public class IRead {

    public void readJavaBook(){
        System.out.println("我正在看Java的書,我可真棒!");
    }

    public void readPythonBook(){
        System.out.println("我正在看Python的書,我可真棒!");
    }

}

調(diào)用一下

    public static void main(String[] args) {
        IRead iRead = new IRead();
        iRead.readJavaBook();
        iRead.readPythonBook();
    }

?書籍是人類進(jìn)步的階梯,看書是會(huì)上癮的。隨著求知欲的提升,我現(xiàn)在還想看AI相關(guān)的書。這個(gè)時(shí)候,因?yàn)闃I(yè)務(wù)需求的擴(kuò)展,需要從低層到高層依次修改代碼,要在IRead類中添加readAIBook方法,同時(shí)在main方法中添加調(diào)用。在真正的業(yè)務(wù)環(huán)境中,系統(tǒng)往往十分龐大,這樣的由底到頂?shù)男薷膶?shí)際上是非常不穩(wěn)定的,對(duì)代碼的修改也容易帶來意想不到的風(fēng)險(xiǎn)。
?接下來我們對(duì)代碼架構(gòu)進(jìn)行優(yōu)化來解決這個(gè)問題,首先創(chuàng)建一個(gè)看書的抽象接口Read:

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description 看書的抽象接口
 * @Date: Create in 10:37 2020/4/9
 */
public interface Read {

    void readBook();

}

接下來編寫ReadJava類

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description
 * @Date: Create in 10:40 2020/4/9
 */
public class ReadJava implements Read {
    public void readBook() {
        System.out.println("我正在看Java的書,我可真棒!");
    }
}

編寫ReadPython類

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description
 * @Date: Create in 10:42 2020/4/9
 */
public class ReadPython implements Read {
    public void readBook() {
        System.out.println("我正在看Python的書,我可真棒!");
    }
}

對(duì)之前的IRead類進(jìn)行修改:

/**
 * @Author: zhouzhen
 * @email: zhouzhen0517@foxmail.com
 * @Description 我愛讀書,讀書讓我快樂
 * @Date: Create in 10:22 2020/4/9
 */
public class IRead {

    public void read(Read read) {
        read.readBook();
    }

}

調(diào)用一下

    public static void main(String[] args) {
        IRead iRead = new IRead();
        iRead.read(new ReadJava());
        iRead.read(new ReadPython());
    }

?再回頭看之前的業(yè)務(wù)需求。不管我再怎么熱愛學(xué)習(xí),對(duì)于新書,只需要新建一個(gè)看書的類,通過傳參的方式來學(xué)習(xí),而不需要再去修改底層代碼。實(shí)際上這就是我們非常熟悉的方式,依賴注入。注入的方式還有構(gòu)造器方式和Setter方式,這里不做贅述。

總結(jié)

?以抽象為基準(zhǔn)比以細(xì)節(jié)為基準(zhǔn)搭建起來的架構(gòu)要穩(wěn)定很多,因此在拿到需求的時(shí)候,要面向接口編程,先頂層再細(xì)節(jié)的設(shè)計(jì)代碼結(jié)構(gòu)。

文章參考

《Spring5核心原理》〔中〕譚勇德(Tom)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容