“每一个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。设计模式的核心在于提供了相关问题的解决方案,使得人们可以简单方便地复用成功的设计和体系结构
设计模式一般有以下 4 个基本要素
- 模式名称 (Pattern Name) 。一个助记名,它用一两个词来描述模式的问题、解决方案和效果
- 问题 (Problem) 。问题描述了应该在何时使用模式
- 解决方案 (Solution) 。解决方案描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式
- 效果 (Consequences) 。效果描述了模式应用的效果及使用模式应权衡的问题
设计模式确定了所包含的类和实例,它们的角色、协作方式以及职责分配。每一个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如何取舍。按照设计模式的目的可以分成三大类
创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样分配职责进行描述
创建型 | 结构型 | 行为型 | |
---|---|---|---|
类 | 工厂方法模式 | 适配器模式 (类) | 解释器模式 模板方法模式 |
对象 | 抽象工厂模式 生成器模式 原型模式 单例模式 |
适配器模式 (对象) 桥接模式 组合模式 装饰器模式 外观模式 享元模式 代理模式 |
责任链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 |
创建型设计模式
创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象
随着系统演化得越来越依嫩于对象复合而不是类继承,创建型模式变得更为重要,当这种情况发生时,重心从对一组固定行为的硬编码 (Hard-coding) 转移为定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为,这样创建有特定行为的对象要求的不仅仅是实例化一个类
在这些模式中有两个不断出现的主旋律
- 它们都将关于该系统使用哪些具体的类的信息封装起来
- 它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道的是由抽象类所定义的接口
因此,创建型模式为什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的 “产品” 对象配置一个系统。配置可以是静态的 (即在编译时指定) ,也可以是动态的 (在运行时)
结构型设计模式
结构型设计模式涉及如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果这个类包含了所有父类的性质。这一模式尤其有助于多个独立开发的类库协同工作。其中一个例子是类形式的 Adapter 模式。一般来说,适配器使得一个接口与其他接口兼容,从而給出了多个不同接口的统一抽象。为此,类适配器对一个 adaptee 类进行私有继承。这样,适配器就可以用 adaptee 的接口表示它的接口
结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态类组合是不可能实现的
行为型设计模式
行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻面了在运行时难以跟踪的、复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来
行为类模式使用继承机制在类间分派行为。其中 Template Method 较为简单和常用。模板方法是一个算法的抽象定义,它逐步地定义该算法,每一步调用一个抽象操作或一个原语操作,子类定义抽象操作以具体实现该算法。另一种行为类模式是 Interpreter,它将一个文法表示为一个类层次,并实现一个解释器作为这些类的实例上的一个操作
行为对象模式使用对象复合而不是继承。一些行为对象模式描达了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。这里一个重要的问题是对等的对象
如何互相了解对方。对等对象可以保持显式的对对方的引用,但那会增加它们的耦合度。在极端情况下,每一个对象都要了解所有其他的对象。Mediator 在对等对象间引入一个 mediator 对象以避免这种情况的出现。mediator 提供了松耦合所需的间接性