架構設計之依賴倒置 控制反轉與依賴注入

2022-01-12 13:31:55 字數 1741 閱讀 2486

名詞解釋

依賴:一種模型元素之間的關係的描述。例如類a呼叫了類b,那麼我們說類a依賴於類b。

耦合:一種模型元素之間的關係的描述。例如類a呼叫了類b或類b呼叫了類a,那麼我們說類a與類b有耦合關係。

耦合度:模型元素之間的依賴程度的量化描述。

控制:一種模型元素之間的關係的描述。例如類a呼叫了類b,那麼我們說類a控制類b。

緒論

架構設計的物件一般是類庫、框架和應用程式。其工作任務除了類庫、框架、應用程式各個模組(類)之間的關係設計之外,還包括類庫、框架和應用程式三者之間關係的設計。而依賴倒置、控制反轉、依賴注入正是常用的一類設計模式。

依賴倒置、控制反轉、依賴注入三者含義和目標基本一致,即通過抽象介面解耦和消除依賴關係。

依賴倒置

從字面理解依賴倒置往往不知所云,通過了解其歷史淵源可以很好的消除這種誤解。在面向結構程式設計時代,架構設計師往往採用自上而下的設計模式,先設計上層模組,再設計下層模組,如此層層分解,導致上層模組嚴重依賴於下層模組,下層模組的一點變化都會導致上層**。到了物件導向程式設計時代,架構設計師使用物件進行設計,通過抽象介面解耦各層之間的依賴關係,為了與面向結構的設計模式區分開,同時體現物件導向的優勢,也為了譁眾取寵,就給這種新的設計模式起了個依賴倒置的名稱。

依賴倒置的核心思想是依賴於抽象。

依賴倒置的原則是上層模組不依賴於下層模組,而是依賴於一套抽象介面,上層模組呼叫介面,下層模組實現介面。以類庫和應用程式為例,我們把應用程式需要呼叫的功能抽象為一組介面,然後由類庫實現這組介面,那麼應用程式就可以使用任意實現了該介面的類庫,從而和類庫解耦。

控制反轉

控制反轉的來歷與依賴倒置相似,以前設計應用程式,雖然會引用類庫,但一切都在應用程式的控制之中。後來根據應用程式的不同場景,人們設計了相應的框架,有了框架之後,再設計應用程式時,就變成了為框架增加自定義行為的設計,控制權轉到了框架手裡,因此說控制權反轉了。

控制反轉是依賴倒置的一種具體實現,強調的是控制流程的依賴倒置,是框架設計的必用模式。框架基於依賴倒置模式設計:對於框架中不確定的部分,框架抽象出一組介面,並依賴於這組介面進行實現,應用程式實現這組介面。

依賴注入

依賴注入也是依賴倒置的一種具體實現,是類庫設計的一種常用模式。類庫中的類基於依賴模式設計:某類依賴於介面,而不是具體的實現,由呼叫者在呼叫時傳入這些介面的具體實現類。

.net中廣泛使用此模式,比如streamreader類,當使用streamreader時,需要例項化乙個stream或其派生類,傳給streamreader的建構函式,然後方能使用該類的方法。

弊病

依賴倒置的基礎是假設抽象是穩定的。對於我們已經了解的事物,當然可以實現很好的抽象,但對於尚未認識清楚的事物,比如使用者需求,就很難保證這個抽象的穩定性。因此一旦這個抽象穩定的假設不成立,那麼依賴倒置不但不能發揮優勢,反倒可能成為包袱。

淺嚐 依賴倒置 控制反轉 依賴注入

要想知道這三者的來歷,我們先要知道這兩個概念 1.依賴 依賴描述了兩個模型元素之間的關係,在類圖上,依賴表明客戶類的操作會呼叫伺服器類的操作 2.耦合 如果改變程式的乙個模組要求另乙個模組同時發生變化,就認為這兩個模組發生了耦合。從上面的定義我們可以看出 如果模組 a呼叫模組 b提供的方法,或訪問模...

IoC模式(依賴 依賴倒置 依賴注入 控制反轉)

依賴就是有聯絡,有地方使用到它就是有依賴它,乙個系統不可能完全避免依賴。如果你的乙個類或者模組在專案中沒有用到它,恭喜你,可以從專案中剔除它或者排除它了,因為沒有乙個地方會依賴它。下面看乙個簡單的示例 public class operationmain public class player 檔案...

PHP 依賴注入,控制反轉,依賴倒置原則

判斷 的好壞,我們有自己的標準 高內聚,低耦合。為了解決這一問題,php中有許多優秀的設計模式,比如工廠模式,單例模式。而在 中體現出來的設計模式,就如依賴注入和控制反轉。那什麼是依賴注入?簡單來說,就是把a類所依賴的b類c類等以屬性或者建構函式等方式注入a類而不是直接在a類中例項化。一般寫 我們這...