依賴倒轉原則

依賴倒轉原則,是指在構造對象時可以動態的創建各種具體對象。

抽象不應該依賴於細節,細節應當依賴於抽象。
要針對接口編程,而不是針對實現編程。
傳遞參數,或者在組合聚合關系中,儘量引用層次高的類。
主要是在構造對象時可以動態的創建各種具體對象,當然如果一些具體類比較穩定,就不必再弄一個抽象類做它的父類,這樣有畫蛇添足的感覺。
優點:
系統擴展靈活。
缺點:
需要大量的類。
開閉原則的主要機制就是依賴倒轉原則,這個原則的內容是:要依賴於抽象,不要依賴於具體,即要針對接口編程,不針對實現編程。
依賴也就是耦合,共分為下面3種。
零耦合(Nil Coupling)關係:兩個類沒有依賴關係。
具體耦合(Concrete Coupling)關係:兩個具體的類之間有依賴關係,如果一個具體類直接引用另外一個具體類,就是這種關係。
抽象耦合(Abstract Coupling)關係:這種關係發生在一個具體類和一個抽象類之間,這樣就使必須發生關係的類之間保持最大的靈活性。
依賴倒轉原則要求客戶端依賴於抽象耦合,抽象不應當依賴於細節,細節應當依賴於抽象。這個原則的另外一個表述就是:要針對接口編程,不要對實現編程。程式在需要引用一個對象時,應當儘可能地使用抽象類型作為變數的靜態類型,這就是針對接口編程的含義。依賴倒轉原則是達到開閉原則的途徑。
要做到依賴倒轉原則,使用抽象方式耦合是關鍵。由於一個抽象耦合總要涉及具體類從抽象類繼承,並且需要保證在任何引用到某類的地方都可以改換成其子類,因此,里氏代換原則是依賴倒轉原則的基礎,依賴倒轉原則是OOD的核心原則,設計模式的研究和套用都是用它作為指導原則的。
再拿上一節的正方形和長方形為例,在最後的測試函式中,正確的方式是使用抽象類作為函式參數:
public class BastTest {
public void zoom(Base base, int width, int height) {
base.zoom(width, height);
}
}
即針對抽象類編程,如果將它換成如下的針對具體類的操作:
public class BastTest {
public void zoom(Rectangle rectangle, int width, int height) {
rectangle.zoom(width, height);
}
}
這樣該類就違反了依賴倒轉原則,就不能夠復用做正方形的操作了。
依賴倒轉原則雖然強大,但是也很難實現。另外,依賴倒轉原則是假定所有的具體類都會變化,這也不是全對,有些具體類就相當穩定。使用這個類的客戶端就完全可以依賴這個具體類,而不用再弄一個抽象類。

相關詞條

熱門詞條

聯絡我們