文章目錄
- 3:依賴倒轉原則(Dependence Inversion Principle簡稱:DIP)
學習設計模式前,自己就在想這麼一厚本書從哪下手比較好,俗話說:萬變不離其宗,這個宗就是我後來想到的是學習設計模式的原則,因為所有的模式都伴隨著原則和物件導向的三大屬性:繼承、多態、封裝。在各個原則之間也有著相互緊密的關係,都有著藕斷絲連的聯絡,知識間都是相同的,只是我們占的角度不同、學習點不同、認識的不同、理解的深度不同,下面帶著大家一起學習重要的原則,為接下來學習多種模式打下良好的原則基礎:
1:單一職責原則(Single Responsibilit Principle),簡稱:SRP
SRP準確解釋:就一個類而言,應該僅有一個引起它變化的原因,如果一個類承擔的職責過多,就等於把這些職責都耦合在一起,一個職責的變化可能會消弱或者抑制這個類完成其他職責的能力,這種耦合會導致脆弱的設計,當變化發生時,設計會遭到意想不到的破壞,當然軟體設計真正要做的許多內容,就是發現職責並把這些職責相互分離,
生活執行個體1:軟體工程中的高內聚低耦合是軟體設計的標準,我們要協調後各個功能之間的關係,各自負責好自己的功能,管好自己的事就好,例如:台式機主機箱的各個零組件就是很好的體現著以原則,這樣電腦出現問題後我們很容易的去維護。
2:開發—封閉原則(The Open_Closeed Principle,簡稱OCP)
OCP是說軟體實體(類、模組、函數等),應該可以擴充,但是不可修改,特徵:對於擴充是開發的(Open for extension),另一個是說對於更改是封閉的(Closed for modification),在設計的時候,時刻要考慮,盡量讓這個類是足夠就好了,寫好了就不要去修改了。
如果新的需求來了,我們需要增加一些類即可,不允許修改的是抽象的類或者介面,允許擴充的是具體的實作類別,抽象類別和介面在"開-閉"原則中扮演著極其重要的角色,即要預知可能變化的需求.又預見所有可能已知的擴充,所以在這裡"抽象化"是關鍵!
無論模組時多麼封閉,都會存在以下無法封閉的變化,既然不可能完全封閉,可以通過構造抽象來隔離這些變化。
OCP是物件導向設計的核心所在,遵循這個原則可以帶來物件導向技術所聲稱的巨大好處,也就是可維護性、可擴充性、可複用性、靈活性,但是我們應該把握好一個度就是不抽象和抽象本身一樣重要。
3:依賴倒轉原則(Dependence Inversion Principle簡稱:DIP)
依賴倒轉原則是抽象不應該依賴細節,細節應該依賴抽象,說白了,就是對介面編程,不要對實現編程,物理主板、CPU、記憶體、硬碟都要是針對介面設計的,總的來說:高層模組不應該依賴低層模組,兩個都應該依賴對象,抽象不應該依賴細節,細節應該依賴抽象。具體一點就是介面或抽象類別,只有介面穩定,那麼任何一個的更改對不用擔心其他受到影響,這使得無論高層模組還是低層模組都可以很容易的實現複用,這才是最好的方法。
生活執行個體1:米老師有事情想通知給大家,不能夠給每個人說一遍吧,那樣太不現實了,所以通過各期的班長,就很容易的下達通知,老師是要依賴各期的班長,也就是說細節要依賴抽象。
生活執行個體2:工廠裡要批量組裝電腦,工人們都是依據圖紙來學習的,也是細節依賴抽象的。
4:裡氏代換原則(Liskov Substitution Principle,簡稱LSP)
這一原則是對繼承的一種約束,是一個軟體實體如果使用的是一個父類的話,那麼一定使用於其子類,而且它察覺不出父類對象和子類對象的區別,也就是說,在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化,簡而言之,子類型必須替換掉它們的父類型。
這個原則,使得繼承複用成為了可能,只有當子類可以替換掉父類,軟體單位功能不受影響時,父類才能真正的被複用,而子類能夠在父類的基礎上增加新的行為,子類的可替換性使得使用父類類型的模組在無需修改的情況下就可以擴充
5:迪米特法則(Law of Demeter,簡稱:LoD)
迪米特法則:如果兩個類不必彼此之間通訊,那麼這兩個類就不應當發生直接的相互作用,如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三周轉寄這個調用。
迪米特法首先強調的前提是在類的結構設計上,每一個類應當盡量降低成員的存取權限,也就是說,一個類封裝好自己的private方法,不需要讓別的類知道的欄位或行為就不要公開,迪米特的根本思想是強調了類之間的耦合,類之間的耦合越弱,越有利於複用,一個處在弱耦合的類被修改,不會對有關係的類造成波及,即資訊的隱藏促進了軟體的複用
生活執行個體1:A依賴B,B依賴C,,當修改A類時要考慮對類B的影響,而B類受到的影響要考慮對C類的影響,等等,如果很多類之間這麼的關聯,什麼時候是個盡頭
生活執行個體2:就是我們程式好中模組與模組之間的實現關係時,通過介面傳遞訊息,這就是迪米特法則的很好體現
6:合成和彙總複用原則(Composition Aggregation Principle,簡稱:CARP)
合成(Composition)和彙總(Aggregation)都是關聯(Association)的特殊種類。彙總表示整體和部分的關係,表示“擁有”;合成則是一種更強的“擁有”,部分和整體的生命週期一樣。合成的新的對象完全支配其組成部分,包括它們的建立和湮滅等。一個合成關係的成分對象是不能與另一個合成關係共用的。
合成彙總是has a de 的關係,繼承是is a 的關係,由於繼承是、中父類變化,子類比變,所以我們一般不要用繼承,優先使用合成彙總複用原則,有注意保持每個類的封裝,降低繼承的層次。
總結:相信學習這些原則和物件導向的特性,以此作為利劍來促使我們不斷的深入理解每個模式,這樣就會順水推舟,學習模式會很輕鬆,因為每個模式裡都體現出我們的原則,設計原則是為了我們更好地完整模式。
一句話:解耦才是硬道理