摘要:依賴倒置在面向?qū)ο笤O(shè)計(jì)中有一個重要的原則是依賴倒置,主要作用是解耦,讓對象與對象之間松耦合。現(xiàn)在根據(jù)依賴倒置原則對例子進(jìn)行修改。
依賴倒置
在面向?qū)ο笤O(shè)計(jì)中有一個重要的原則是依賴倒置(Dependence Inversion Principle),主要作用是解耦,讓對象與對象之間松耦合。定義如下:高層模塊不應(yīng)該依賴底層模塊,他們都應(yīng)該依賴抽象。抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。
光看定義很難理解依賴倒置到底是什么意思,先舉一個簡單的例子。
有以下兩個類:
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類通過調(diào)用MysqlConnection類的executeQuery方法執(zhí)行sql語句,依賴關(guān)系如下圖所示:
這里就違反了依賴倒置原則,高層模塊DAO強(qiáng)耦合了底層模塊MysqlConnection。如果系統(tǒng)需要更換數(shù)據(jù)庫為SqlServer,我們就不得不去修改Dao類,增加一個SqlserverConnection類,這又違反了面向?qū)ο笤O(shè)計(jì)的開閉原則。例子中的Dao是一個不穩(wěn)定、隨時會因?yàn)榈讓幽K的變更而出現(xiàn)BUG的類。
現(xiàn)在根據(jù)依賴倒置原則對例子進(jìn)行修改。
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類通過調(diào)用Connection接口的executeQuery方法執(zhí)行sql語句,依賴關(guān)系如下圖所示:
修改后的Dao類依賴于Connection抽象接口,MysqlConnection類也以實(shí)現(xiàn)接口的方式依賴于Dao類。這時如果要更換為SqlServer數(shù)據(jù)庫,只要增加一個SqlserverConnection類并實(shí)現(xiàn)Connection接口就完成了,不需要去修改Dao類了,大大的降低了耦合度。
之所以要細(xì)節(jié)依賴于抽象,歸根結(jié)底是因?yàn)槌橄笫菍?xì)節(jié)的歸納和本質(zhì)總結(jié),細(xì)節(jié)可能會不停的變更,其本質(zhì)卻不會變化。依賴倒置原則感覺和面向接口編程的思想是如出一轍的,同樣都是通過依賴抽象來降低耦合度,只是側(cè)重點(diǎn)不同。
只是看書可能學(xué)習(xí)效率并不是很高,還是需要多寫寫學(xué)到的東西,這就是這篇文章出現(xiàn)的理由了。可能會有錯誤或不全的地方,歡迎指出。
我的個人博客
參考資料:
那些年搞不懂的高深術(shù)語——依賴倒置?控制反轉(zhuǎn)?依賴注入?面向接口編程
【面向?qū)ο笤O(shè)計(jì)原則】之依賴倒置原則(DIP)
依賴倒置原則
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71477.html
摘要:四依賴倒置原則依賴倒置原則簡介依賴倒置原則的英文名稱是,簡稱。依賴倒置原則的表現(xiàn)其實(shí)就是面向接口編程。依賴倒置原則的優(yōu)點(diǎn)減少類間的耦合性,提高系統(tǒng)的穩(wěn)定性。結(jié)合里氏替換原則使用接口負(fù)責(zé)定義屬性和方法,并且聲明與其他對象的依賴關(guān)系。 面向?qū)ο蠡驹瓌t(2)- 里式代換原則與依賴倒置原則 面向?qū)ο蠡驹瓌t(1)- 單一職責(zé)原則與接口隔離原則面向?qū)ο蠡驹瓌t(2)- 里式代換原則與依賴倒置原...
摘要:面向?qū)ο笤O(shè)計(jì)的五大原則單一職責(zé)原則接口隔離原則開放封閉原則替換原則依賴倒置原則。主要是針對繼承的設(shè)計(jì)原則,繼承與派生多態(tài)是的主要特性。 面向?qū)ο笤O(shè)計(jì)的五大原則:單一職責(zé)原則、接口隔離原則、開放-封閉原則、替換原則、依賴倒置原則。這些原則主要是由Robert C.Martin在《敏捷軟件開發(fā)——原則、方法、與實(shí)踐》一書中總結(jié)出來,這五大原則也是23種設(shè)計(jì)模式的基礎(chǔ)。 單一職責(zé)原則 Sin...
摘要:依賴倒置原則是個設(shè)計(jì)原則中最難以實(shí)現(xiàn)的原則,它是實(shí)現(xiàn)開閉原則的重要途徑,依賴倒置原則沒有實(shí)現(xiàn),就別想實(shí)現(xiàn)對擴(kuò)展開放,對修改關(guān)閉。 1、單一職能原則(Single Responsibility Principle, SRP) 定義 There should never be more than one reason for a class to change.應(yīng)該有且僅有一個原因引起類的...
摘要:為什么要采用面向?qū)ο缶幊探鉀Q問題更容易設(shè)計(jì)計(jì)算機(jī)程序就是為了解決人類的問題。面向?qū)ο缶幊绦枰獙I(yè)務(wù)及代碼的架構(gòu)是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過程式編程 面向?qū)ο缶幊? 在講面向?qū)ο缶幊虝r先講一下什么是順序編程,什么是過程式編程,什么是面向?qū)ο缶幊蹋? 順序編程: 就是只用一個單線程去執(zhí)行一段代碼,執(zhí)行過程根據(jù)代碼依次從上...
摘要:前言本章我們要講解的是五大原則語言實(shí)現(xiàn)的第篇,依賴倒置原則。當(dāng)應(yīng)用依賴倒置原則的時候,關(guān)系就反過來了。在當(dāng)靜態(tài)類型語言的上下文里討論依賴倒置原則的時候,耦合的概念包括語義和物理兩種。依賴倒置原則和依賴注入都是關(guān)注依賴,并且都是用于反轉(zhuǎn)。 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實(shí)現(xiàn)的第5篇,依賴倒置原則LSP(The Dependency Invers...
閱讀 2980·2021-11-16 11:45
閱讀 5124·2021-09-22 10:57
閱讀 1763·2021-09-08 09:36
閱讀 1585·2021-09-02 15:40
閱讀 2508·2021-07-26 23:38
閱讀 1184·2019-08-30 15:55
閱讀 923·2019-08-30 15:54
閱讀 1213·2019-08-29 14:06