依賴反轉原則

面向對象編程領域中,依賴反轉原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統的依賴關係建立在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴於低層次的模塊的實現細節,依賴關係被顛倒(反轉),從而使得低層次模塊依賴於高層次模塊的需求抽象。

該原則規定:

  1. 高層次的模塊不應該依賴於低層次的模塊,兩者都應該依賴於抽象接口
  2. 抽象接口不應該依賴於具體實現。而具體實現則應該依賴於抽象接口。

該原則顛倒了一部分人對於面向對象設計的認識方式。如高層次和低層次對象都應該依賴於相同的抽象接口。[1]

圖1中,高層對象A依賴於底層對象B的實現;圖2中,把高層對象A對底層對象的需求抽象為一個接口A,底層對象B實現了接口A,這就是依賴反轉。

描述

在傳統的應用架構中,低層次的組件設計用於被高層次的組件使用,這一點提供了逐步的構建一個複雜系統的可能。在這種結構下,高層次的組件直接依賴於低層次的組件去實現一些任務。這種對於低層次組件的依賴限制了高層次組件被重用的可行性。

依賴反轉原則的目的是把高層次組件從對低層次組件的依賴中解耦出來,這樣使得重用不同層級的組件實現變得可能。把高層組件和低層組件劃分到不同的包/庫(在這些包/庫中擁有定義了高層組件所必須的行為和服務的接口,並且存在高層組件的包)中的方式促進了這種解耦。由於低層組件是對高層組件接口的具體實現,因此低層組件包的編譯是依賴於高層組件的,這顛倒了傳統的依賴關係。眾多的設計模式,比如插件服務定位器或者依賴反轉,則被用來在運行時把指定的低層組件實現提供給高層組件。

應用依賴反轉原則同樣被認為是應用了適配器模式,例如:高層的類定義了它自己的適配器接口(高層類所依賴的抽象接口)。被適配的對象同樣依賴於適配器接口的抽象(這是當然的,因為它實現了這個接口),同時它的實現則可以使用它自身所在低層模塊的代碼。通過這種方式,高層組件則不依賴於低層組件,因為它(高層組件)僅間接的通過調用適配器接口多態方法使用了低層組件,而這些多態方法則是由被適配對象以及它的低層模塊所實現的。

另一個例子是檯燈和按鈕的例子頁面存檔備份,存於網際網路檔案館)。

歷史

依賴反轉原則由羅伯特·C·馬丁英語Robert Cecil Martin提出,並且在數篇公開著作中被表述,包括論文《面向對象設計質量標準:對於依賴的分析》[2],以及一篇1996年出現在C++報道中的名為《依賴反轉原則》的文章[3],和《敏捷軟件開發,原則,模式和實踐》,《C#中的敏捷原則,模式和實踐》兩本書。

參見

引用

  1. ^ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates. Hendrickson, Mike , 編. Head First Design Patterns (paperback) 1. O'REILLY. 2004 [2012-06-21]. ISBN 978-0-596-00712-6. (原始內容存檔於2012-08-22) (英語).  |editor1-last=|editor-last=只需其一 (幫助)
  2. ^ Object Oriented Design Quality Metrics: an analysis of dependencies Robert C. Martin, C++ Report, Sept/Oct 1995 (PDF). [2011-07-14]. (原始內容存檔 (PDF)於2011-07-14). 
  3. ^ The Dependency Inversion Principle, Robert C. Martin, C++ Report, May 1996 (PDF). [2012-12-04]. (原始內容存檔 (PDF)於2019-05-13). 

外部連結