说到设计模式,我个人认为它是我们程序员必备的一项技能,学会灵活使用它,会对我们码代码事半功倍,不管是耦合性还是代码的美观性,它都发挥了重要的作用。
它就好比在金庸武侠小说中的武林高手的那些武功招式,学会利用自己的招式见招拆招那么他就是天下无敌,而设计模式于我们而言也是一样的。想要成为优秀的码农
那就一起来学习下设计模式吧,哈哈!
模式的定义与产生
- 模式(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) ★☆☆☆☆
使用设计模式的好处
- 融合了众多专家的经验,并以一种标准的形式供广大开发人员所用
- 提供了一套通用的设计词汇和一种通用的语言,以方便开发人员之间进行沟通和交流,使得设计方案更加通俗易懂
- 让人们可以更加简单方便地复用成功的设计和体系结构
- 使得设计方案更加灵活,且易于修改
- 将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本
- 有助于初学者更深入地理解面向对象思想,方便阅读和学习现有类库与其他系统中的源代码,还可以提高软件的设计水平和代码质量