談到設計模式,不能不說一下GRASP (職責分配原則),這個比模式更重要.我將再後邊接着來分析.
下面我來分析一下設計模式原則,以及在設計模式中的體現.主要參考:程傑 <大話設計模塊>(這裏用DH代替) 和Justin Tech 的博客.
一:設計模式的核心原則是:"開-閉"原則( Open - Closed Principle 縮寫:OCP ),一切的一切都是圍繞着"開-閉"原則展開的
開閉原則:說軟件實體(類,模塊,函數等)應該可以擴展,但是不可以修改 [DH].
意思是,在一個系統中,對於擴展是開放的,對於修改是關閉的,一個好的系統是在不修改源代碼的情況下,可以擴展你的功能..而實現開閉原則的關鍵就是抽象化.
在"開-閉"原則中,不允許修改的是抽象的類或者接口,允許擴展的是具體的實現類,抽象類和接口在"開-閉"原則中扮演着極其重要的角色..即要預知可能變化的需求.又預見所有可能已知的擴展..所以在這裏"抽象化"是關鍵!
當然對於修改,我們不可能完全避免,也不可能完全預知到未來的變化.所以我們要做到儘量去不要修改,或者少的修改就能達到我們的目標.
例如:對於簡單工廠模式.我們有能力預知到未來可能添加計算,所以,我們將運算類抽象出來.爲了以後方便擴展.這裏的運算類是不可以修改的.但是對於他的子類.我們是可以擴展的.
設計模式中的體現UML圖
二:依賴倒轉原則
A:高層模塊不應該依賴底層模塊 B:抽象不應該依賴細節,細節應該依賴抽象[DH]就是說要依賴抽象,而不要依賴具體的實現..如果說開閉原則是目標,依賴倒轉原則是到達"開閉"原則的手段..如果要達到最好的"開閉"原則,就要儘量的遵守依賴倒轉原則..可以說依賴倒轉原則是對"抽象化"的最好規範!!
通俗的說就是隻有抽象的東西纔是最穩定的,也就是說,我們依賴的是它的穩定。如果將來“抽象”也不穩定了,那麼誰穩定我跟誰,其實說白了不就是傍大款嗎!比如我們在觀察者模式中(Observer)這裏的通知者,就不應該是具體.因爲我們應當考慮到如果前臺那裏換了人怎麼辦?這個通知還可以是其他人通知.比如老闆要通知去做某件事怎麼辦?爲了讓大家都能用這個通知.所以要設置成抽象的.這裏的前臺,老闆都要依賴這個通知.也就是說.細節要依賴抽象.
三:里氏代換原則:
定義:子類型必須能夠替換它們的父類型[DH]
這個原則是對繼承的一個約束,也就是說,繼承中子類嚴格滿足"is a "的關係.這裏我個人有深刻的體會.尤其是在看別人的UML圖的時候.
對你幫助很大.當你看到一個繼承的時候.要習慣性的把他的父類和子類看成一個整體.這樣會有助於你去理解各個類之間的關係.因爲根據
里氏代換原則.父類出現的地方子類也可以出現.比如我們再看工廠模式的時候,你看到有的書上簡單工廠類關聯着運算父類.有的書上是關聯着運算類的子類.其實仔細想想他們都沒有錯,
父類和子類的關聯都是一樣的,父類能出現的地方,子類就可以出現.在設計模式中的體現:
設計模式中所有繼承都能體現着這一原則.我舉一個不符合原則的例子.
四:單一職能原則
定義:就一個類而言,應該僅有一個引起他變化的原因[DH]也就是說,不要把變化原因各不相同的職責放在一起,因爲不同的變化會影響到不相干的職責。再通俗一點地說就是,不該你管的事情你不要管,
管好自己的事情就可以了,多管閒事害了自己也害了別人。(當然這裏說的多管閒事跟見義勇爲是兩回事,我們提倡見義勇爲!)
這個就是說,一個類儘量做到了功能單一,比如在mvc中,判斷數據的類和添加數據庫的類一定要分開.單一職能的不是說職能多了我們實現不了,是
爲了後期的測試維護,每個類的很單一,我們找錯誤的時候就可以一步到位.添加新的功能的時候,也不用牽扯到很多的類.
在設計模式中的體現:
烤肉者就管烤肉,他也不管收錢,也不管記錄.這樣把"地攤"上的烤肉者分成服務員和烤肉的人.讓職責單一.不容易出錯.上邊的都是幾個原則,下面介紹兩個法則:
(1)迪米特法則:系統中的類,儘量不要與其他類互相作用,減少類之間的耦合度,因爲在你的系統中,擴展的時候,你可能需要修改這些類,而類與類
之間的關係,決定了修改的複雜度,相互作用越多,則修改難度就越大,反之,如果相互作用的越小,則修改起來的難度就越小..例如A類依賴B類,
則B類依賴C類,當你在修改A類的時候,你要考慮B類是否會受到影響,而B類的影響是否又會影響到C類..如果此時C類再依賴D類的話,呵呵,
我想這樣的修改有的受了..
(2)接口隔離法則:這個法則與迪米特法則是相通的,迪米特法則是目的,而接口隔離法則是對迪米特法則的規範..爲了做到儘可能小的耦合性,我們
需要使用接口來規範類,用接口來約束類.要達到迪米特法則的要求,最好就是實現接口隔離法則,實現接口隔離法則,你也就滿足了迪米特法則...
這裏也體現了一個依賴原則,要儘量依賴抽象,不要依賴具體.
設計模式中的體現:高層模塊依靠接口和底層模塊依賴.
總結:學習設計模式的基礎就是理解設計原則,只用理解了這些原則,加上OO的三大特性.再去體會設計模式滿足那些原則.最後達到你可以運用這些原則來寫出自己的設計模式來,這纔是最高境界.我在看了一遍大話設計模式以後,將其中的思想總結出來.和大家分享.