面向對象設計原則-依賴倒置

依賴倒置

在面向對象設計中有一個重要的原則是依賴倒置(Dependence Inversion Principle),主要做用是解耦,讓對象與對象之間鬆耦合。定義以下:高層模塊不該該依賴底層模塊,他們都應該依賴抽象。抽象不該該依賴於細節,細節應該依賴於抽象。html

光看定義很難理解依賴倒置究竟是什麼意思,先舉一個簡單的例子。git

有如下兩個類:github

public class Dao {

    private MysqlConnection connection;

    public Dao(MysqlConnection connection) {
        this.connection = connection;
    }

    public void findAll() {
        connection.executeQuery("SELECT * FROM test");
    }

}
public class MysqlConnection {

    public void executeQuery(String sql) {
        System.out.println(sql);
    }

}

Dao類經過調用MysqlConnection類的executeQuery方法執行sql語句,依賴關係以下圖所示:sql

這裏就違反了依賴倒置原則,高層模塊DAO強耦合了底層模塊MysqlConnection。若是系統須要更換數據庫爲SqlServer,咱們就不得不去修改Dao類,增長一個SqlserverConnection類,這又違反了面向對象設計的開閉原則。例子中的Dao是一個不穩定、隨時會由於底層模塊的變動而出現BUG的類。數據庫

如今根據依賴倒置原則對例子進行修改。編程

public class Dao {

    private Connection connection;

    public Dao(Connection connection) {
        this.connection = connection;
    }

    public void findAll() {
        connection.executeQuery("SELECT * FROM test");
    }

}
public interface Connection {

    void executeQuery(String sql);

}
public class MysqlConnection implements Connection {

    @Override
    public void executeQuery(String sql) {
        System.out.println(sql);
    }

}

Dao類經過調用Connection接口的executeQuery方法執行sql語句,依賴關係以下圖所示:ide

修改後的Dao類依賴於Connection抽象接口,MysqlConnection類也以實現接口的方式依賴於Dao類。這時若是要更換爲SqlServer數據庫,只要增長一個SqlserverConnection類並實現Connection接口就完成了,不須要去修改Dao類了,大大的下降了耦合度。學習

之因此要細節依賴於抽象,歸根結底是由於抽象是對細節的概括和本質總結,細節可能會不停的變動,其本質卻不會變化。依賴倒置原則感受和麪向接口編程的思想是一模一樣的,一樣都是經過依賴抽象來下降耦合度,只是側重點不一樣。ui

只是看書可能學習效率並非很高,仍是須要多寫寫學到的東西,這就是這篇文章出現的理由了。可能會有錯誤或不全的地方,歡迎指出。this

個人我的博客

參考資料:

相關文章
相關標籤/搜索