设计模式概述
1.设计模式的定义
设计模式(Design Pattern)是一套被反复使用、多数人知晓、经过分类的、代码设计经验的总结。
使用目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
2.设计模式的诞生
肯特·贝克和沃德·坎宁安在1987年利用克里斯托佛·亚历山大在建筑设计领域里的思想开发了设计模式并把此思想应用在Smalltalk中的图形用户接口的生成中。一年后Erich Gamma在他的苏黎世大学博士毕业论文中开始尝试把这种思想改写为适用于软件开发。于此同时James Coplien 在1989年至1991 年也在利用相同的思想致力于C++的开发,而后于1991年发表了他的著作Advanced C++ Idioms。就在这一年Erich Gamma 得到了博士学位,然后去了美国,在那与Richard Helm, Ralph Johnson ,John Vlissides合作出版了Design Patterns - Elements of Reusable Object-Oriented Software 一书,在此书中共收录了23个设计模式。这四位作者在软件开发领域里也以他们的匿名著称Gang of Four(四人帮,简称GoF),并且是他们在此书中的协作导致了软件设计模式的突破。
所以,对模式的定义可以抽象为在特定环境下,人们为了解决某类重复出现问题,而总结归纳出来的有效解决方案。
GoF将模式的概念引入软件工程领域,这标志着软件模式的诞生。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式。
软件模式主要由四部分构成,包括待解决问题、约束条件、解决方案、优点。
软件模式与具体的应用领域无关,也就是说无论从事的是移动开发、桌面开发、Web开发还是嵌入式软件的开发,都可以使用软件模式。
在软件模式中,设计模式是研究最为深入的分支,它融合了众多专家的设计经验,已经在成千上万的软件中得以应用。 1995年, GoF将收集和整理好的23种设计模式汇编成了一本名叫《设计模式》的书,该书的出版也标志着设计模式正式成为面向对象版软件工程的一个重要研究分支。
3.设计模式的发展
1987年,Kent Beck和Ward cunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式,再OOPSLA会议上发表了他们的成果。
1990年,OOPSLA与ECOOP联合举办,Erich Gamma和Richard Helm等人开始讨论有关模式的话题,“四人组”正式成立,并开始着手设计模式的分类整理问题。
1991年,OOPSLA,Bruce Andrerson主持了首次针对设计模式的研讨会。
1992年,OOPSLA,Andrerson再次主持研讨会,模式已经逐渐成为人们讨论的话题。
1993年,Kent Beck和Grady Booth赞助了第一次关于设计模式的会议,这个设计模式研究组织发展成为著名的Hillside Group研究组。
1994年,由Hillside Group发起,在美国伊利诺伊州的Allerton Park召开了第一届关于面向对象的世界性会议,名为PLoP(Pattern Languages of Programs,编程语言模式会议),简称PLoP'94。
1995年,PLoP'95仍在伊利诺伊州的Allerton Park举行,“四人组”出版了《设计模式:可复用面向对象软件的基础》一书,本书成为1995年最抢手面向对象书籍,也成为设计模式的经典书籍。
从1995年至今,设计模式在软件开发中得以广泛应用,再Sun的Java SE/Java EE平台和Microsoft的.net平台设计中就应用了大量的设计模式。
4.设计模式分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
5.设计模式的作用
有软件开发经验的朋友应该有这样的体会:构建一个优秀的系统最困难之处不在于编码(coding),而是在早期做出的设计(design)上的决定。设计是软件开发生命周期中的关键阶段,好的设计能产生好的产品,而不当的设计则会影响最终产品的质量。设计的重要性已经深入人心,这从人们热烈讨论和研究设计模式就能看出来。设计模式是拥有多年开发设计经验的人给我们的经验传承,它是作为专家的建议而引入的,它背后的真正威力是其对真实世界的抽象。如果我们没有足够的经验,我们很难做出好的设计,但是富有经验的开发者和设计者以设计模式的形式将他们的经验传授给我们,拥有了这些经验之后,我们也能做出好的设计来了。不仅如此,设计模式还提高了我们软件复用的水平,从而提高了生产效率。