說到設計模式,我個人認為它是我們程序員必備的一項技能,學會靈活使用它,會對我們碼代碼事半功倍,不管是耦合性還是代碼的美觀性,它都發揮了重要的作用。
它就好比在金庸武俠小說中的武林高手的那些武功招式,學會利用自己的招式見招拆招那么他就是天下無敵,而設計模式於我們而言也是一樣的。想要成為優秀的碼農
那就一起來學習下設計模式吧,哈哈!
模式的定義與產生
- 模式(Pattern)起源於建築業而非軟件行業
- 模式之父--美國加利福尼亞大學環境結構中心研究所所長Christopher Alexander博士
- 《A Pattern Language:Towns,Builldings,Construction》--253個城市和建築規划模式
- 模式
-
- Context(模式可適用的前提條件)
- Theme或Problem(在特定條件下要解決的目標問題)
- Solution(對目標問題的求解過程中各種物理關系的記述)
- Alexander給出了關於模式的金典定義:
- 每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心,通過這種方式,人們可以無數次地重用那些已有的解決方案,無需再重復相同的工作
- 模式是在特定環境下人們解決某類重復出現問題的一套成功或有效的解決方案
軟件模式概述
模式的發展
- 1987年,Kent Beck和Ward Cunningham借鑒Alexander的模式思想在程序開發中開始應用一些模式 ,在OOPSLA會議上發表了他們的成果
- 1990年,OOPSLA與ECOOP聯合舉辦,Erich Gamma和Richard Helm等人開始討論有關模式的話題(Bruce Anderson主持),“四人組” 正式成立,並開始着手進行設計模式的分類整理工作
- 1991 年,OOPSLA,Bruce Anderson主持了首次針對設計模式的研討會
- 1992 年,OOPSLA ,Anderson再度主持研討會,模式已經逐漸成為人們討論的話題
注: OOPSLA (Object-Oriented Programming, Systems, Languages & Applications,面向對象編程、系統、語言和應用大會),編程語言及軟件工程國際頂級會議,2010年改為SPLASH --- Systems, Programming, Languages and Applications: Software for Humanity
- 1993年,Kent Beck 和 Grady Booch 贊助了第一次關於設計模式的會議,這個設計模式研究組織發展成為著名的Hillside Group研究組
- 1994 年,由Hillside Group發起,在美國伊利諾伊州(Illinois)的Allerton Park召開了第1屆關於面向對象模式的世界性會議,名為PLoP(Pattern Languages of Programs, 編程語言模式會議),簡稱PLoP‘94
- 1995年,PLoP‘95 仍在伊利諾伊州的Allerton Park舉行 ,“四人組”出版了《設計模式:可復用面向對象軟件的基礎》(Design Patterns: Elements of Reusable Object-Oriented Software)一書,本書成為1995年最搶手的面向對象書籍,也成為設計模式的經典書籍
設計模式的發展
- 從1995年至今,設計模式在軟件開發中得以廣泛應用,在Sun的Java SE/Java EE平台和Microsoft的.NET平台設計中應用了大量的設計模式
- 輕量級框架:Struts、Spring、Hibernate、JUnit、NHibernate、NUnit ……
- 語言:C++、Java、C#、Objective-C、 VB.net、Smalltalk、PHP、 Delphi、JavaScript、Ruby……
- 得到越來越多的企業和高校的關注與重視
- 越來越多的書籍和網站
設計模式的定義
- 設計模式(Design Pattern)
- 一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結
- 是一種用於對軟件系統中不斷重現的設計問題的解決方案進行文檔化的技術
- 是一種共享專家設計經驗的技術
- 目的:為了可重用代碼、讓代碼更容易被他人理解、提高代碼可靠性
- 設計模式是在特定環境下為解決某一通用軟件設計問題提供的一套定制的解決方案,該方案描述了對象和類之間的相互作用。
設計模式的基本要素
- 設計模式一般包含模式名稱、問題、目的、解決方案、效果、實例代碼和相關設計模式等基本要素,4個關鍵要素如下:
- 模式名稱 (Pattern Name)
- 問題 (Problem)
- 解決方案 (Solution)
- 效果 (Consequences)
設計模式的分類
- 根據目的(模式是用來做什么的)可分為創建型(Creational),結構型(Structural)和行為型(Behavioral)三類:
- 創建型模式主要用於創建對象
- 結構型模式主要用於處理類或對象的組合
- 行為型模式主要用於描述類或對象如何交互和怎樣分配職責
- 根據范圍,即模式主要是處理類之間的關系還是處理對象之間的關系,可分為類模式和對象模式兩種:
- 類模式處理類和子類之間的關系,這些關系通過繼承建立,在編譯時刻就被確定下來,是一種靜態關系
- 對象模式處理對象間的關系,這些關系在運行時變化,更具動態性
創建型模式
- 抽象工廠模式(Abstract Factory) ★★★★★
- 建造者模式(Builder) ★★☆☆☆
- 工廠方法模式(Factory Method) ★★★★★
- 原型模式(Prototype) ★★★☆☆
- 單例模式(Singleton) ★★★★☆
結構型模式
- 適配器模式(Adapter) ★★★★☆
- 橋接模式(Bridge) ★★★☆☆
- 組合模式(Composite) ★★★★☆
- 裝飾模式(Decorator) ★★★☆☆
- 外觀模式(Facade) ★★★★★
- 享元模式(Flyweight) ★☆☆☆☆
- 代理模式(Proxy) ★★★★☆
行為型模式
- 職責鏈模式(Chain of Responsibility) ★★☆☆☆
- 命令模式(Command) ★★★★☆
- 解釋器模式(Interpreter) ★☆☆☆☆
- 迭代器模式(Iterator) ★★★★★
- 中介者模式(Mediator) ★★☆☆☆
- 備忘錄模式(Memento) ★★☆☆☆
- 觀察者模式(Observer) ★★★★★
- 狀態模式(State) ★★★☆☆
- 策略模式(Strategy) ★★★★☆
- 模板方法模式(Template Method) ★★★☆☆
- 訪問者模式(Visitor) ★☆☆☆☆
使用設計模式的好處
- 融合了眾多專家的經驗,並以一種標准的形式供廣大開發人員所用
- 提供了一套通用的設計詞匯和一種通用的語言,以方便開發人員之間進行溝通和交流,使得設計方案更加通俗易懂
- 讓人們可以更加簡單方便地復用成功的設計和體系結構
- 使得設計方案更加靈活,且易於修改
- 將提高軟件系統的開發效率和軟件質量,且在一定程度上節約設計成本
- 有助於初學者更深入地理解面向對象思想,方便閱讀和學習現有類庫與其他系統中的源代碼,還可以提高軟件的設計水平和代碼質量