【大話設計模式】筆記——依賴倒轉原則

《大話設計模式》之依賴倒轉原則。數據庫

本節先是經過小菜爲妹紙修電腦的例子引出了電腦製造的一個原則:內部封轉,明確接口,統一標準。具體說來就是,各個部件的具體實現和製造不盡相同,可是他們都遵循一個接口標準,使得各個部件能夠無縫的連接起來;同時在這個接口之上能夠進行有限的擴展。電腦配件之間的關係還體現另外一個基本原則:強內聚,鬆耦合。編程

電腦配件還體現了前面說過兩個原則,單一職責原則和開放封閉原則。這裏着重強調一個新的原則,叫依賴倒轉原則。依賴倒轉原則,原話解釋是抽象不該該依賴細節,細節應該依賴於抽閒。說白了,就是要針對接口編程,不要對實現編程。回到例子上,主板,cpu等都是針對接口設計的,若是針對實現來設計,內存就要對應到具體的某個品牌的主板,就會出現換內存須要把主板也換了的尷尬。設計模式

依賴倒轉原則:函數

A. 高層模塊不該該依賴底層模塊。兩個都應該依賴抽象。spa

B. 抽象不該該依賴細節。細節應該依賴抽象。設計

爲何須要依賴倒轉?面向對象開發時,爲了使得經常使用代碼能夠複用,通常都會把這些代碼寫出許多的函數程序庫,新項目中去調用這些底層的函數就能夠了。好比數據庫訪問模塊等。問題也出在這裏,當有新項目時,發現業務邏輯的高層模塊都是同樣的, 但客戶卻但願使用不一樣的數據庫或存儲信息的方式。咱們但願再次利用這些高層模塊,但高層模塊與低層模塊綁定在一塊兒的,無法複用這些高層模塊,這就麻煩了。而若是無論高層仍是低層模塊,它們都依賴於抽象,具體一點就是藉口或者抽象類,只要藉口是穩定的,那麼任何一個的更改都不用擔憂受其它受到影響。這就使得不管高層仍是低層模塊均可以很容易的被複用。對象

但爲何依賴了抽象的接口或抽象類,就不怕更改呢?這裏須要講到里氏代換原則。具體說來是一個軟件實體若是使用的是一個父類的話,那麼必定適用於其子類,並且察覺不出父類和子類對象的區別。也就是說,在軟件裏面,把父類都替換成它的子類,程序的行爲沒有變化。簡單來講,子類型必須可以替換掉他們的父類型。爲何須要這樣呢?只有當子類能夠替換掉父類,軟件單位的功能不受到影響時,父類才能真正被複用,而子類也可以在父類的基礎上增長新的行爲。繼承

書中舉了一個例子,貓是繼承動物類的,以動物的身份擁有吃、喝、跑、叫等行爲。當某一天,咱們須要狗、牛、羊也擁有相似的行爲,因爲他們都是繼承與動物,因此除了更改實例化的地方,程序其餘處不須要改變。接口


再回頭來看依賴倒轉原則,高層模塊不該該依賴低層模塊,兩個都應該依賴抽象,以下圖:內存