1. 程式人生 > >從招式與內功談起——設計模式概述(一)

從招式與內功談起——設計模式概述(一)

               

      關於金庸小說中到底是招式重要還是內功重要的爭論從未停止,我們在這裡並不分析張無忌的九陽神功和令狐沖的獨孤九劍到底哪個更厲害,但我想每個武林人士夢寐以求的應該是既有淋漓的招式又有深厚的內功。看到這裡大家可能會產生疑問了?搞什麼,討論什麼招式與內功,我只是個軟體開發人員。別急,正因為你是軟體開發人員我才跟你談這個,因為我們的軟體開發技術也包括一些招式和內功:JavaC#C++等程式語言,EclipseVisual Studio等開發工具,JSPASP.net等開發技術,StrutsHibernateJBPM等框架技術,所有這些我們都可以認為是招式;而資料結構、演算法、設計模式、重構、軟體工程等則為內功。招式可以很快學會,但是內功的修煉需要更長的時間。我想每一位軟體開發人員也都希望成為一名兼具淋漓招式和深厚內功的“上乘”軟體工程師,而對設計模式的學習與領悟將會讓你“內功”大增,再結合你日益純熟的“招式”,你的軟體開發“功力”一定會達到一個新的境界。既然這樣,還等什麼,趕快行動吧。下面就讓我們正式踏上神奇而又美妙的設計模式之旅。

1 設計模式從何而來

      在介紹設計模式的起源之前,我們先要了解一下模式的誕生與發展。與很多軟體工程技術一樣,模式起源於建築領域,畢竟與只有幾十年歷史的軟體工程相比,已經擁有幾千年沉澱的建築工程有太多值得學習和借鑑的地方。

      那麼模式是如何誕生的?讓我們先來認識一個人——Christopher Alexander(克里斯托弗.亞歷山大),哈佛大學建築學博士、美國加州大學伯克利分校建築學教授、加州大學伯克利分校環境結構研究所所長、美國藝術和科學院院士……頭銜真多,微笑,不過他還有一個“暱稱”——模式之父(The father of patterns)Christopher Alexander

博士及其研究團隊用了約20年的時間,對住宅和周邊環境進行了大量的調查研究和資料收集工作,發現人們對舒適住宅和城市環境存在一些共同的認同規律Christopher Alexander在著作A Pattern Language: Towns, Buildings, Construction中把這些認同規律歸納為253模式,對每一個模式(Pattern)都從Context(前提條件)、ThemeProblem(目標問題)、 Solution(解決方案)三個方面進行了描述,並給出了從使用者需求分析到建築環境結構設計直至經典例項的過程模型。

      在Christopher Alexander的另一部經典著作《建築的永恆之道》中,他給出了關於模式的定義:

      每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心,通過這種方式,我們可以無數次地重用那些已有的成功的解決方案,無須再重複相同的工作。這個定義可以簡單地用一句話表示:

模式是在特定環境下人們解決某類重複出現問題的一套成功或有效的解決方案。【A pattern is a successful or efficient solution to a recurring  problem within a context

       1990年,軟體工程界開始關注ChristopherAlexander等在這一住宅、公共建築與城市規劃領域的重大突破。最早將模式的思想引入軟體工程方法學的是1991-1992年以“四人組(Gang of Four,簡稱GoF,分別是Erich Gamma, Richard Helm, Ralph JohnsonJohn Vlissides)”自稱的四位著名軟體工程學者,他們在1994年歸納發表了23種在軟體開發中使用頻率較高的設計模式,旨在用模式來統一溝通面向物件方法在分析、設計和實現間的鴻溝。

      GoF將模式的概念引入軟體工程領域,這標誌著軟體模式的誕生。軟體模式(Software Patterns)是將模式的一般概念應用於軟體開發領域,即軟體開發的總體指導思路或參照樣板。軟體模式並非僅限於設計模式,還包括架構模式、分析模式和過程模式等,實際上,在軟體開發生命週期的每一個階段都存在著一些被認同的模式

      軟體模式是在軟體開發中某些可重現問題的一些有效解決方法,軟體模式的基礎結構主要由四部分構成,包括問題描述【待解決的問題是什麼】、前提條件【在何種環境或約束條件下使用】、解法【如何解決】和效果【有哪些優缺點】,如圖1-1所示:

1-1 軟體模式基本結構

    軟體模式與具體的應用領域無關,也就是說無論你從事的是移動應用開發、桌面應用開發、Web應用開發還是嵌入式軟體的開發,都可以使用軟體模式。

    在軟體模式中,設計模式是研究最為深入的分支,設計模式用於在特定的條件下為一些重複出現的軟體設計問題提供合理的、有效的解決方案,它融合了眾多專家的設計經驗,已經在成千上萬的軟體中得以應用。 1995年, GoF將收集和整理好的23種設計模式彙編成Design Patterns: Elements of Reusable Object-Oriented Software【《設計模式:可複用面向物件軟體的基礎》】一書,該書的出版也標誌著設計模式正式成為面向物件(Object Oriented)軟體工程的一個重要研究分支。

    從1995年至今,無論是在大型API或框架(如JDK.net Framework等)、輕量級框架(如StrutsSpring、 HibernateJUnit等)、還是應用軟體的開發中,設計模式都得到了廣泛的應用。如果你正在從事面向物件開發或正準備從事面向物件開發,無論你是使用JavaC#Objective-CVB.netSmalltalk等純面向物件程式語言,還是使用C++PHPDelphiJavaScript等可支援面向物件程式設計的語言,如果你一點設計模式也不懂,我可以毫不誇張的說:你真的out了。