一、设计模式概述
1、软件设计模式概念
设计模式的由来
1、1977年,美国著名建筑大师克里斯托夫.亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造》描述了一些常见的建筑设计问题,并提出了253种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。
2、1979年他的另一部经典著作《建筑的永恒之道》进一步强化了设计模式的思想,为后来的建筑设计指明了方向。
3、1987年,肯特.贝克和沃德.坎宁安首先将克里斯托夫.亚历山大的模式思想应用到了Smalltalk的图形用户接口的生成中。
4、1990年,软件工厂界才开始研讨设计模式的话题。
5、1995年,艾瑞克.伽玛、理查德.海尔姆、拉尔夫.约翰森、约翰.威利斯迪斯等四位作者合作出版了《设计模式:可复用面向对象软件的基础》,收录了23个设计模式。
软件设计模式的概念与意义
1、软件设计模式(Software Design Pattern) :是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
作用:软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。
目的:
(1).提高代码的可重用性。
(2).代码的可读性。
(3).代码的可靠性。
软件设计模式的基本要素
模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等
要素 | 说明 |
---|---|
模式名称(PatternName) | 可以根据模式的问题、特点、解决方案、功能和效果命名。 |
问题(Problem) | 描述了该模式的应用环境,即何时使用该模式。 |
解决方案(Solution) | 包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。 |
效果 | 描述了模式应用效果以及使用该模式应该权衡的问题,即模式的优缺点。 |
主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩充性、可移植性的影响,也考虑其实现问题。显式地列出这些效果(Consequence)对理解和评价这些模式有很大的帮助。
2、设计模式分类
根据目的来分:根据模式是用来完成什么工作来划分的
创建型模式:用来描述“怎么创建对象”,它的主要特点是“将对象的创建与使用分离”。
结构型模式:用来描述如何将类或对象按某种布局组成更大的结构。
行为型模式:用于描述类或对象之间怎样相互写作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
作用范围
1、根据模式是用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。
(1) 类模式:用于处理类与子类之间的关系,这次关系通过继承来建立,是静态的,在编译时刻确定下来了。
(2) 对象模式:用于处理对象之间的关系,这些关系可以组合或聚合来实现,在运行时刻是可以变化的,更具动态性。
范围\目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法 | (类)适配器 | 模板方法、解释器 |
对象模式 | 单例、原型、抽象工厂、建造者 | 代理(对象) 适配器、桥接、装饰、外观、享元、组合 | 策略、命令、职责链、状态、观察者、迭代器、访问者、备忘录 |
设计模式 | 说明 |
---|---|
单例(Singleton)模式 | 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其扩展是有限多例模式。 |
原型(Prototype)模式 | 将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。 |
工厂方法(Factory Method) | 定义一个用于创建产品的接口,由子类决定生产什么产品。 |
抽象工厂(AbstractFactory)模式 | 提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。 |
建造者(Builder)模式 | 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。 |
代理(Proxy)模式 | 为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。 |
适配器(Adapter)模式 | 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 |
桥接(Bridge)模式 | 将抽象与现实分离,便它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 |
装饰(Decorator)模式 | 动态的给对象增加一些职责,即增加其额外的功能。 |
外观(Facade)模式 | 为多个复杂的子系列提供一个一致的接口,使这些子系统更加容易被访问。 |
享元(Flyweight)模式 | 运用共享技术来有效地支持大量细粒度对象的复用。 |
组合(Composite)模式 | 将对象组合成树桩层次结构,使用户对单个对象和组合对象具有一致的访问性。 |
模版方法(TemplateMethod)模式 | 定义一个操作中的算法骨架,而将算法的一些步骤延迟 到子类中,便得子类可以不改变该算法结构的情况下重定义核算的某些特定步骤。 |
策略(Strategy)模式 | 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 |
命令(Command)模式 | 将一个请求封装为一个对象,便发出请求的责任和执行请求的责任分割开。 |
职责链(Chain of Responsibility)模式 | 把请求从链中的一个对象传到下一个对象,知道请求被响应为止。通过这种方式去除对象之间的耦合。 |
状态(State)模式 | 允许一个对象在其内部状态发生改变时改变其行为能力。 |
观察者(Observer)模式 | 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。 |
中介者(Mediator)模式 | 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。 |
迭代器(iterator)模式 | 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 |
访问者(Visitor)模式 | 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。 |
备忘录(Memento)模式 | 在不破坏封装的前提下,获取并保存一个对象的内部状态,以便以后恢复它。 |
解释器(Interpreter) | 模式提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。 |