1. 程式人生 > >設計模式-依賴倒轉原則

設計模式-依賴倒轉原則

在我們進行電腦的維修時,如果哪一部分出了問題,我們只需要更換這一個部分就可以了,比如記憶體出了問題,我們只需要更換記憶體,不需要更換主機板。由於PC易插拔的方式,那麼不管哪一個出問題,都可以在不影響別的部件的前提下修改或替換。

在PC電腦裡叫易插拔,面向物件裡把這種關係叫做強內聚,鬆耦合。比如CPU,只要把介面定義好,內部再複雜也不讓外界知道,而主機板只需要預留與CPU針腳的插槽就可以了。

依賴倒轉原則:高層模組不應該依賴低層模組,兩個都應該依賴抽象。抽象不應該依賴細節,細節應該依賴抽象。

說白了,就是要針對介面程式設計,不要對實現程式設計。

在用C語言進行面向過程開發時,為了使得常用程式碼可以複用,一把會把這些常用程式碼寫成許多函式的程式庫,這樣做新專案時,去呼叫這些低層的函式就可以了。比如把訪問資料庫的程式碼寫成了函式,每次做新專案就去呼叫這些函式,這也就叫做高層模組依賴低層模組。

這樣做是有問題的。我們做新專案時,發現業務邏輯的高層模組都是一樣的,但客戶卻希望使用不同的資料庫或儲存資訊方法,這時就出現麻煩了,我們希望再次利用這些高層模組,但高層模組都是與低層的訪問資料庫繫結在一起的,沒辦法複用這些高層模組,這就很糟糕了。

反之,如果不管高層模組還是低層模組,它們都依賴於抽象,具體一點就是介面或抽象類,只要介面是穩定的,那麼任何一個的更改都不同擔心其他收到影響,這就使得無論高層模組還是低層模組都可以很容易地被複用。這才是最好的辦法。

為什麼依賴了抽象的介面或抽象類,就不怕更改呢?

里氏代換原則:子型別必須能夠替換掉它們的父型別。

只有當子類可以代替掉父類,軟體單位的功能不受到影響時,父類才能真正被複用,而子類也能夠在父類的基礎上增加新的行為,

由於子型別的可替換性才使得使用父類型別的模組在無需修改的情況下就可以擴充套件。

依賴倒轉其實就是誰也不要依賴誰,除了約定的介面,大家都可以靈活自如。

依賴倒轉起始可以說是面向物件設計的標誌,用哪種語言來編寫程式不重要,如果編寫時考慮的都是如何針對抽象程式設計而不是針對細節程式設計,即程式中所有的依賴關係都是終止於抽象類或者介面,那就是面向物件的設計,反之就是過程化的設計了。