在面向對象設計中有一個重要的原則是依賴倒置(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
參考資料: