要想知道這三者的來歷,我們先要知道這兩個概念:
1.依賴:依賴描述了兩個模型元素之間的關係,在類圖上,依賴表明客戶類的操作會呼叫伺服器類的操作
2.耦合:如果改變程式的乙個模組要求另乙個模組同時發生變化,就認為這兩個模組發生了耦合。
從上面的定義我們可以看出:如果模組
a呼叫模組
b提供的方法,或訪問模組
b中的某些資料成員,我們就認為模組
a依賴於模組
b,也可以說是模組
a控制模組
b,模組
a和模組
b之間發生了耦合。
那麼依賴對於我們的程式設計來說,到底會有怎樣的影響呢?
由於人類的理解力有限,大多數人難以理解和把握過於複雜的系統。把軟體系統劃分成多個模組,可以有效控制模組的複雜度,使每個模組都易於理解和維護。但在這種情況下,模組之間就必須以某種方式交換資訊,也就是必然要發生某種耦合關係。如果某個模組和其它模組沒有任何關聯(哪怕只是潛在的或隱含的依賴關係),我們就幾乎可以斷定,該模組不屬於此軟體系統,應該從系統中剔除。如果所有模組之間都沒有任何耦合關係,其結果必然是:整個軟體不過是多個互不相干的系統的簡單堆積,對每個系統而言,所有功能還是要在乙個模組中實現,這等於沒有做任何模組的分解。
因此,模組之間必定會有這樣或那樣的依賴關係,永遠不要幻想消除所有依賴。但是,過強的耦合關係(如乙個模組的變化會造成乙個或多個其他模組也同時發生變化的依賴關係)會對軟體系統的質量造成很大的危害。特別是當需求發生變化時,**的維護成本將非常高。所以,我們必須想盡辦法來控制和消解不必要的耦合,特別是那種會導致其它模組發生不可控變化的關係。依賴倒置、控制反轉、依賴注入等原則就是人們在和依賴關係進行艱苦卓絕的鬥爭過程中不斷產生和發展起來的。
依賴倒置(dependenceinversion)
robertmatin是這樣描述依賴倒置原則的:
1.上層模組不應該依賴於下層模組,他們共同依賴於乙個抽象;
2.抽象不能依賴於具象,具象依賴於抽象
其含義是:為了消除兩個模組間的依賴關係,一概在兩個模組之間頂乙個抽象介面,上層模組呼叫抽象介面定義的函式,下層模組實現該介面。以類庫和應用程式為例,我們把應用程式需要呼叫的功能抽象為一組介面,然後由類庫實現這組介面,那麼應用程式就可以使用任意實現了該介面的類庫,從而和類庫解耦。
從字面理解依賴倒置往往不知所云,通過了解其歷史淵源可以很好的消除這種誤解。在面向結構程式設計時代,架構設計師往往採用自上而下的設計模式,先設計上層模組,再設計下層模組,如此層層分解,導致上層模組嚴重依賴於下層模組,下層模組的一點變化都會導致上層**。到了物件導向程式設計時代,架構設計師使用物件進行設計,通過抽象介面解耦各層之間的依賴關係,為了與面向結構的設計模式區分開,同時體現物件導向的優勢,也為了譁眾取寵,就給這種新的設計模式起了個依賴倒置的名稱。
控制反轉
控制反轉
控制反轉的來歷與依賴倒置相似,以前設計應用程式,雖然會引用類庫,但一切都在應用程式的控制之中。後來根據應用程式的不同場景,人們設計了相應的框架,有了框架之後,再設計應用程式時,就變成了為框架增加自定義行為的設計,控制權轉到了框架手裡,因此說控制權反轉了。
控制反轉是依賴倒置的一種具體實現,強調的是控制流程的依賴倒置,是框架設計的必用模式。框架基於依賴倒置模式設計:對於框架中不確定的部分,框架抽象出一組介面,並依賴於這組介面進行實現,應用程式實現這組介面。
依賴注入
依賴注入也是依賴倒置的一種具體實現,是類庫設計的一種常用模式。類庫中的類基於依賴模式設計:某類依賴於介面,而不是具體的實現,由呼叫者在呼叫時傳入這些介面的具體實現類。
.net中廣泛使用此模式,比如streamreader類,當使用streamreader時,需要例項化乙個stream或其派生類,傳給streamreader的建構函式,然後方能使用該類的方法。
IoC模式(依賴 依賴倒置 依賴注入 控制反轉)
依賴就是有聯絡,有地方使用到它就是有依賴它,乙個系統不可能完全避免依賴。如果你的乙個類或者模組在專案中沒有用到它,恭喜你,可以從專案中剔除它或者排除它了,因為沒有乙個地方會依賴它。下面看乙個簡單的示例 public class operationmain public class player 檔案...
PHP 依賴注入,控制反轉,依賴倒置原則
判斷 的好壞,我們有自己的標準 高內聚,低耦合。為了解決這一問題,php中有許多優秀的設計模式,比如工廠模式,單例模式。而在 中體現出來的設計模式,就如依賴注入和控制反轉。那什麼是依賴注入?簡單來說,就是把a類所依賴的b類c類等以屬性或者建構函式等方式注入a類而不是直接在a類中例項化。一般寫 我們這...
依賴倒置原則 控制反轉和依賴注入
1.依賴倒置原則 1 上層模組不依賴與下層模組,而是共同依賴於抽象模組 或者介面 2 抽象的東西不能是具象,具象依賴於抽象。2.控制反轉 inversion of control 是軟體執行時的一種行為。比如 物件a依賴於物件b,但是在b並不是直接去建立a,而是從外界取得a。就是說 乙個物件並不直接...