物件導向的設計原則五 依賴倒轉原則

2021-08-30 03:13:37 字數 1653 閱讀 7032

動機

在乙個應用程式中,我們有一些實現了基礎的、主要的操作的底層類和一些封裝了複雜邏輯的上層類。實現這種結構的很自然地方式就是,先編寫底層類,完成後再編寫複雜的上層類。因為上層類是由其他東西定義的,所以這看起來是一種很合理的方式。但是這不是乙個靈活的設計,如果我們需要替換乙個底層類時會發生什麼?

讓我們以經典的拷貝程式為例,它從鍵盤讀取一些字元,然後把他們輸出到列印裝置上。包含該邏輯的上層類是copy類,底層類是keyboardreader和printerwriter。

在乙個不好的設計中,上層類直接使用底層的類,在這種情況下,如果我們想要把輸出定向到新的filewriter類,就必須修改copy類的**(假設它是乙個具有很多邏輯的複雜類並且很難測試)。

為了避免這種問題,我們可以在上層類和底層類之間引入乙個抽象層。因為上層模組包含複雜的邏輯,所以它們不應該依賴於底層模組,新的抽象層也不應該基於底層模組而建立。底層模組應該基於抽象層而建立。

基於這個原則,設計類結構的方式應該是從上層模組到底層模組。

上層類--->抽象層--->底層類

依賴倒轉原則

例項

下面是乙個違反了依賴倒轉原則的例子。我們有乙個上層類manager和底層類worker。我們需要在程式中新增乙個新模組,因為有新的特殊的工作者被雇用。為此,我們建立乙個新的類superworker。

我們假設manager是乙個包含非常複雜的邏輯的類,現在為了引入新的superworker,我們需要修改它。讓我們看一下這有哪些缺點:

所有的這些問題需要大量的時間去解決。但是如果程式的設計符合依賴倒轉原則將會非常簡單。意思是我們設計manager類和乙個iworker介面以及一些實現了該介面的worker類。當需要新增superworker類時我們只需要讓它實現iworker介面。

//dependency inversion principle - bad example

class worker

}class manager

public void manage()

}class superworker

}

下面是支援依賴倒轉原則的**。在這個新的設計中,我們增加了乙個新的抽象層iwork介面。現在,上面的問題得到了解決:

//dependency inversion principle - good example

inte***ce iworker

class worker implements iworker

}class superworker implements iworker

}class manager

public void manage()

}

總結

應用該原則意味著上層類不直接使用底層類,他們使用介面作為抽象層。這種情況下上層類中建立底層類的物件的**不能直接使用new操作符。可以使用一些建立型設計模式,例如工廠方法,抽象工廠和原型模式。

模版設計模式是應用依賴倒轉原則的乙個例子。

當然,使用該模式需要額外的努力和更複雜的**,不過可以帶來更靈活的設計。不應該隨意使用該原則,如果我們有乙個類的功能很有可能在將來不會改變,那麼我們就不需要使用該原則。

物件導向設計原則 依賴倒轉原則

如果說開閉原則是物件導向設計的目標的話,那麼依賴倒轉原則就是物件導向設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則定義如下 依賴倒轉原則 dependency inversion principle,dip 抽象不應該 依賴於細節,細節應當依賴於抽象。換言之,要針對介面程式設計,而不...

物件導向設計原則之依賴倒轉原則

如果說開閉原則是物件導向設計的目標的話,那麼依賴倒轉原則就是物件導向設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則是robert c.martin在1996年為 c reporter 所寫的專欄engineering notebook的第三篇,後來加入到他在2002年出版的經典著作 ...

物件導向設計原則之依賴倒轉原則

如果說開閉原則是物件導向設計的目標的話,那麼依賴倒轉原則就是物件導向設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則是robert c.martin在1996年為 c reporter 所寫的專欄engineering notebook的第三篇,後來加入到他在2002年出版的經典著作 ...