設計模式總篇
備註:參考自經典書籍GoF Book:《Design Patterns: Elements of Reusable Object-Oriented Software》(《設計模式:可復用面向對象軟件的基礎》)
一、什麽是設計模式
設計模式源自建築學,Christopher Alexander說過:“每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重復勞動。”盡管Alexander所指的是城市和建築模式,但他的思想也同樣適用於面向對象設計模式,只是在面向對象的解決方案裏,我們用對象和接口代替了墻壁和門窗。兩類模式的核心都在於提供了相關問題的解決方案。
一般而言,一個模式有四個基本要素:
1. 模式名稱(pattern name) 一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。
2. 問題(problem) 描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,如怎樣用對象表示算法等。也可能描述了導致不靈活設計的類或對象結構。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。
3. 解決方案(solution) 描述了設計的組成成分,它們之間的相互關系及各自的職責和協作方式。因為模式就像一個模板,可應用於多種不同場合,所以解決方案並不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象組合)來解決這個問題。
4. 效果(consequences) 描述了模式應用的效果及使用模式應權衡的問題。盡管我們描述設計決策時,並不總提到模式效果,但它們對於評價設計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關註對時間和空間的衡量,它們也表述了語言和實現問題。因為復用是面向對象設計的要素之一,所以模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
一個設計模式命名、抽象和確定了一個通用設計結構的主要方面,這些設計結構能不用來構造可復用的面向對象設計。設計模式確定了所包含的類和實例,他們的角色、協作方式以及職責分配。每一個設計模式都集中於一個特定的面向對象設計問題或設計要點,描述了什麽時候使用它,在另一些設計約束條件下是否還能使用,以及使用的效果和如何取舍。
設計模式使人們可以更加簡單方便地復用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。設計模式幫助你做出有利於系統復用的選擇,避免設計損害了系統復用性。通過一個顯示類和對象作用關系以及它們之間潛在練習惡說明規範,設計模式甚至能夠提高已有系統的文檔管理和系統維護的有效性。簡而言之,設計模式可以幫助設計者更快更好地完成系統設計。
通俗地講,所謂設計模式,就是一套被反復使用的代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、可維護。設計模式使人們可以更加簡單方便的復用成功的設計和體系結構。將已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。
二、設計模式分類
設計模式在粒度和抽象層次上各不相同。以下是在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》進行的分類。
GoF根據了兩條準則對模式進行分類:
一、目的準則:即模式是用來完成什麽工作的。模式依據其目的可分為創建型(Creational)、結構型(Structural)、行為型 (Behavioral)三種。
以上分類根據兩條準則
- 創建型模式與對象的創建有關;
- 結構型模式處理類或對象的組合;
- 行為型模式對類或對象怎樣交互和怎樣分配職責進行描述。
二、範圍準則:指定模式主要是用於類還是用於對象。
- 類模式處理類和子類之間的關系,這些關系通過繼承建立,是靜態的,在編譯時刻便確定下來了。
- 對象模式處理對象間的關系,這些關系在運行時刻是可以變化的,更具動態性。
從某種意義上來說,幾乎所有模式都使用繼承機制,所以“類模式”只指那些集中於處理類間關系的模式,而大部分模式都屬於對象模式的範疇。
三、設計模式之間的關系
創建型類模式將對象的部分創建工作延遲到子類,而創建型對象模式則將它延遲到另一個對象中。
結構型類模式使用繼承機制來組合類,而結構型對象模式則描述了對象的組裝方式。
行為型類模式使用繼承描述算法和控制流,而行為型對象模式則描述一組對象怎樣協作完成單個對象所無法完成的任務。
還有其他組織模式的方式。有些模式經常會被綁在一起使用,例如,Composite常和Iterator或Visitor一起使用;Iterator或Visitor一起使用;有些模式是可替代的,例如,Prototype常用來替代Abstract Factory;有些模式盡管使用意圖不同,但產生的設計結果是很相似的,例如,Composite和Decorator的結構圖是相似的。
還有一種方式是根據模式的“相關模式”部分所描述的它們怎樣互相引用來組織設計模式。如下圖給出了模式關系的圖形說明。
顯然,存在著許多組織設計模式的方法。從多角度去思考模式有助於對它們的功能、差異和應用場合的更深入理解。
設計模式總篇