設計模式幾大原則 .

談到設計模式,不能不說一下GRASP (職責分配原則),這個比模式更重要.我將再後邊接着來分析.

下面我來分析一下設計模式原則,以及在設計模式中的體現.主要參考:程傑 <大話設計模塊>(這裏用DH代替)  和Justin Tech 的博客.


一:設計模式的核心原則是:"開-閉"原則(  Open - Closed Principle 縮寫:OCP  ),一切的一切都是圍繞着"開-閉"原則展開的

開閉原則:說軟件實體(類,模塊,函數等)應該可以擴展,但是不可以修改 [DH]. 

意思是,在一個系統中,對於擴展是開放的,對於修改是關閉的,一個好的系統是在不修改源代碼的情況下,可以擴展你的功能..而實現開閉原則的關鍵就是抽象化. 
在"開-閉"原則中,不允許修改的是抽象的類或者接口,允許擴展的是具體的實現類,抽象類和接口在"開-閉"原則中扮演着極其重要的角色..即要預知可能變化的需求.又預見所有可能已知的擴展..所以在這裏"抽象化"是關鍵! 
當然對於修改,我們不可能完全避免,也不可能完全預知到未來的變化.所以我們要做到儘量去不要修改,或者少的修改就能達到我們的目標.

例如:對於簡單工廠模式.我們有能力預知到未來可能添加計算,所以,我們將運算類抽象出來.爲了以後方便擴展.這裏的運算類是不可以修改的.但是對於他的子類.我們是可以擴展的.

設計模式中的體現UML圖

image

二:依賴倒轉原則 
A:高層模塊不應該依賴底層模塊 B:抽象不應該依賴細節,細節應該依賴抽象[DH]

就是說要依賴抽象,而不要依賴具體的實現..如果說開閉原則是目標,依賴倒轉原則是到達"開閉"原則的手段..如果要達到最好的"開閉"原則,就要儘量的遵守依賴倒轉原則..可以說依賴倒轉原則是對"抽象化"的最好規範!! 
通俗的說就是隻有抽象的東西纔是最穩定的,也就是說,我們依賴的是它的穩定。如果將來“抽象”也不穩定了,那麼誰穩定我跟誰,其實說白了不就是傍大款嗎!

比如我們在觀察者模式中(Observer)這裏的通知者,就不應該是具體.因爲我們應當考慮到如果前臺那裏換了人怎麼辦?這個通知還可以是其他人通知.比如老闆要通知去做某件事怎麼辦?爲了讓大家都能用這個通知.所以要設置成抽象的.這裏的前臺,老闆都要依賴這個通知.也就是說.細節要依賴抽象.

image

三:里氏代換原則:

定義:子類型必須能夠替換它們的父類型[DH] 
這個原則是對繼承的一個約束,也就是說,繼承中子類嚴格滿足"is a "的關係.這裏我個人有深刻的體會.尤其是在看別人的UML圖的時候. 
對你幫助很大.當你看到一個繼承的時候.要習慣性的把他的父類和子類看成一個整體.這樣會有助於你去理解各個類之間的關係.因爲根據 
里氏代換原則.父類出現的地方子類也可以出現.

比如我們再看工廠模式的時候,你看到有的書上簡單工廠類關聯着運算父類.有的書上是關聯着運算類的子類.其實仔細想想他們都沒有錯, 
父類和子類的關聯都是一樣的,父類能出現的地方,子類就可以出現. 

在設計模式中的體現: 
設計模式中所有繼承都能體現着這一原則.我舉一個不符合原則的例子.

image

 四:單一職能原則 
定義:就一個類而言,應該僅有一個引起他變化的原因[DH] 

也就是說,不要把變化原因各不相同的職責放在一起,因爲不同的變化會影響到不相干的職責。再通俗一點地說就是,不該你管的事情你不要管, 
管好自己的事情就可以了,多管閒事害了自己也害了別人。(當然這裏說的多管閒事跟見義勇爲是兩回事,我們提倡見義勇爲!) 
這個就是說,一個類儘量做到了功能單一,比如在mvc中,判斷數據的類和添加數據庫的類一定要分開.單一職能的不是說職能多了我們實現不了,是
爲了後期的測試維護,每個類的很單一,我們找錯誤的時候就可以一步到位.添加新的功能的時候,也不用牽扯到很多的類. 
在設計模式中的體現:

image  
烤肉者就管烤肉,他也不管收錢,也不管記錄.這樣把"地攤"上的烤肉者分成服務員和烤肉的人.讓職責單一.不容易出錯.

上邊的都是幾個原則,下面介紹兩個法則:

(1)迪米特法則:系統中的類,儘量不要與其他類互相作用,減少類之間的耦合度,因爲在你的系統中,擴展的時候,你可能需要修改這些類,而類與類
之間的關係,決定了修改的複雜度,相互作用越多,則修改難度就越大,反之,如果相互作用的越小,則修改起來的難度就越小..例如A類依賴B類, 
則B類依賴C類,當你在修改A類的時候,你要考慮B類是否會受到影響,而B類的影響是否又會影響到C類..如果此時C類再依賴D類的話,呵呵, 
我想這樣的修改有的受了..


(2)接口隔離法則:這個法則與迪米特法則是相通的,迪米特法則是目的,而接口隔離法則是對迪米特法則的規範..爲了做到儘可能小的耦合性,我們 
需要使用接口來規範類,用接口來約束類.要達到迪米特法則的要求,最好就是實現接口隔離法則,實現接口隔離法則,你也就滿足了迪米特法則...
這裏也體現了一個依賴原則,要儘量依賴抽象,不要依賴具體. 
設計模式中的體現:高層模塊依靠接口和底層模塊依賴.

image

總結:學習設計模式的基礎就是理解設計原則,只用理解了這些原則,加上OO的三大特性.再去體會設計模式滿足那些原則.最後達到你可以運用這些原則來寫出自己的設計模式來,這纔是最高境界.我在看了一遍大話設計模式以後,將其中的思想總結出來.和大家分享.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章