注:所有知识来源于《设计模式:可复用软件面向对象的基础》
1 什么是设计模式
Christopher Alexander说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。”
一般而言,一个模式有四个基本要素:
模式名(pattern name) 用一两个此来描述模式的问题、解决方案和效果。
问题(problem) 描述了应该在何时使用模式,解释了设计问题和问题存在的前因后果,可能描述了特定的设计问题,也可能描述了导致不灵活设计的类或对象结构,有时候问题部分会包括使用模式必须满足的一系列先决条件。
解决方案(solution) 描述了设计的组成部分、他们之间的相互关系及各自的职责和协作方式。不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合来解决这个问题。
效果(consequence) 描述了模式应用的效果及使用模式应权衡的问题。
设计模式命名、抽象和确定了一个通用设计结构的主要方面,这些设计结构能被用来构造可复用的面向对象设计。设计模式确定了所包含的类和实例,它们的角色、协作方式以及职责分配。每一个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如何取舍。
2 描述设计模式
使用统一的格式描述设计模式有助于学习、比较和使用设计模式。
模式名和分类 模式名简洁地描述了模式地本质,分类主要是使用该模式的目的。
意图 意图是回答“设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?”
别名 模式的其他名称
动机 用以说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景。
适用性 什么情况下可以使用该设计模式?该模式可用来改进哪些不良设计?怎么识别这些情况?
结构 原书是采用基于对象建模技术(OMT)[RBP+91]的表示法对模式中的类进行图形描述,使用了交互图[JCJO92,BOO94],我会采用统一建模语言UML来进行描述。
参与者 指设计模式中的类和/或对象以及他们各自的职责。
协作 模式的参与者怎样协作以实现他们的职责。
效果 模式怎样支持它的目标?使用模式的效果和所需做的权衡是什么?系统结构的哪些方面可以独立改变?
实现 实现模式时需要知道的一些提示、技术要点及应避免的缺陷,以及是否存在某些特定于实现语言的问题。
代码示例 使用具体的编程语言进行实现,原文采用C++或Smalltalk,我会采用Java来进行实现。
已知应用 实际系统中发现的模式的例子。
相关模式 与这个模式紧密相关的模式有哪些?期间重要的不同之处是什么?这个模式应与哪些其他模式一起使用?
3 23种设计模式一句话介绍
表1 设计模式的分类
目的 | ||||
---|---|---|---|---|
创建型 | 结构型 | 行为型 | ||
范围 | 类 | Factory Method | Adapter | Interpreter Template Method |
对象 | Abstract Factory Builder Prototype Singleton |
Adapter Bridge Composite Decorator Facade Flyweight Proxy |
Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
图1 设计模式之间的关系
3.1 创建型
Abstract Factory 抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
Builder 建造者模式,将一个复杂对象的构建与它的实现部分分离,使它们都可以独立地变化。
Factory Method 工厂方法模式,定义一个用于创建对象的接口,让子类决定将哪一个类实例化,是一个类的实例化推迟到其子类。
Prototype 原型模式,用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Singleton 单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
3.2 结构型
Adapter 适配器模式,将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Bridge 桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Composite 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,是的客户对单个对象和组合对象的使用具有一致性。
Decorator 装饰器模式,动态地给一个对象添加一些额外的职责,就扩展而言,Decorator比生成子类方式更为灵活。
Facade 外观模式,为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更容易使用。
Flyweight 享元模式,运用共享技术有效地支持大量细粒度的对象。
Proxy 代理模式,为其他对象提供一个代理以控制对这个对象的访问。
3.3 行为型
Chain of Responsibility 职责链模式,接触请求的发送者和接收者之间的耦合,是多个对象都有机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Command 命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求排队或记录请求日志,以支持可取消的操作。
Interpreter 解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
Iterator 迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
Mediator 中介者模式,用一个中介对象来封装一些列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Memento 备忘录模式,在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到保存的状态。
Observer 观察者模式,定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
State 状态模式,允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类。
Strategy 策略模式,定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,本模式使得算法的变化可独立于使用它的客户。
Template Method 模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类不改变一个算法的结构即可重定义该算法的某些特定的步骤。
Visitor 访问者模式,表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。