轉載請保留出處,尊重他人勞動。
引子:
模式的定義,似乎都如出一轍但又似乎都略有不同,這些由于關注點的不同導致的不同點讓事情變得有點復雜了。
簡史:
何謂設計模式?任何一本講解軟件設計模式的書籍都會首先問出這個問題。而大部分又都會給出一個(或若干個)傳說中軟件設計模式起源的定義:
“每個模式就是一條由三部分組成的規則,它表示了一個特定環境、一個問題和一個解決方案之間的關系。
…
簡單地說,模式是一個出現在世界上的實物,同時也是一條規則,告訴你應該如何創建一個實物、應該在何時創建。它既是過程,也是實物;既是對當前實物的描述,也是對創建實物的過程的描述?!?/span> ——《建筑的永恒之道》
“對于反復出現設計問題的抽象解決方案” ——《建筑模式語言》
之后,這些概念在不同的軟件設計模式的書籍中不斷被本地化:
在Gof(Gang of four)的《Design Pattern》中模式被定義成三段值: 模式就是表示特定情境、問題、與方案之間的關系。
在《J2EE core Patterns》一書種的定義:模式是用來描述所交流的問題及其解決方案。
《面向模式的軟件體系結構》的結論:一個軟件體系結構的模式描述了一個出現特定設計語境中的特殊的再現設計問題,并為她的解決方案提供了一個經過充分驗證的通用圖式。解決方案圖式通過描述其組成組件、他們的責任和相互關系以及它們的協作方式來具體指定。
當然在一些其他書籍中也有相關論述:模式就是“范例”;就是同時考慮一對問題,求解方案的“專家行為”等等……
觀點:
這些觀點和概念,似乎都如出一轍但又似乎都略有不同,這些由于關注點的不同導致的不同點讓事情變得有點復雜了。我在瀏覽這些書籍的時候,一直在想是不是應該自己歸納一下自己的理解呢?OK,讓我自己動手做做看。
定義:

廣義上講:模式就是一個環境中,一個反復出現的典型問題與這個問題的以經過論證的解決方案,以及它們三者緊密關系的整體的抽象描述。
為了便于記憶,用序列可以表示為:
環境:出現問題以及其解決方案的場景。
問題:環境中可以被一個解決方案覆蓋的一個反復出現的典型問題。
解決方案:已經被證實可以在語境中解決一個典型問題的策略與方法。
關系:以上已經提到的三點的緊密地關聯性。
模式:以上四點的整體的抽象描述。
這樣軟件設計模式應該就已經一目了然了:
軟件設計模式就是指:在軟件領域這個大環境下的解決軟件設計問題的模式(廣義模式)。
為了便于記憶,用序列可以表示為:
環境具化:軟件設計領域
問題具化:軟件設計的問題
軟件設計模式:有以上兩點具化的模式(廣義模式)。
Haha 現在這樣的定義描述就比較清晰了。
特點:
在前面的定義中已經能夠看到許多模式的特性了,比如:整體的抽象性,問題的反復性,解決方案的以論證性,關系的緊密性等等。其實,模式還有若干隱含的特性。
歸納性:模式其實是對經過充分考驗的經驗,是提煉過后的一種可復用的知識。它與經驗論、循證主義、同屬于人類最基本的認知手段歸納法的產物。
動、靜性:模式本身既描述一個抽象后的物件,也描述一個抽象過程。
與定義一樣軟件設計模式同樣繼承了這些特性。