一、模式(Pattern)
定义
我们处理大量问题时,在很多不同的问题中重复出现的一种性质,它使得我们可以使用一种方法来描述问题实质并用本质上相同,但细节永不会重复的方法去解决,这种性质就叫模式。
一个围棋下得好的人知道,好的“形”对于围棋非常重要。形是棋子在棋盘上的几何形状的抽象化。形就是模式(Pattern),也是人脑把握和认识外界的关键。
成为模式的条件
1、它可以解决问题。模式不能仅仅反映问题,而必须对问题提出解决方案。
2、它所提出解决方案是正确的,而且不是很明显的。
3、它必须是涉及软件系统深层的结构的东西,不能仅是对已有的模块的描述。
4、它必须满足人的审美,简洁美观。
二、模式分类
2.1、创立性模式
•创立性模式(CreationalPatterns)是类在实例化时使用的模式。
•当一些系统在创立对象时,需要动态地决定怎样创立对象,创立哪些对象
•创立性模式告诉我们怎样构造和包装这些动态的决定。
2.2、结构性模式
•结构性模式描述类和对象怎样结合在一起成为较大的结构。
•结构性模式描述两种不同的东西:类与类的实例。
2.3、行为模式
•行为模式设计到算法和对象职责间的分配。
•行为模式不仅是关于类和对象的,而且还描述它们之间的作用。
•这些模式刻画了运行时刻难以跟踪的复杂的控制流,它帮助软件设计者在设计软件的时候把注意力从控制流转移到对象间的联系上。
| 创立型 | 结构型 | 行为型 |
类 | 工厂方法(Factory Method) | 适配器(Adapter) | 解释器(Interpreter) 模板方法(Template Method) |
对象 | 抽象工厂(Abstract Factory) 生成器(Builder) 原型(Prototype) 单态(Singleton) |
桥接(Bridge) 组成(Composite) 装饰(Decorator) 外观(Facade) 享元(Flyweight) 代理(Proxy) | 责任链(Chain of Responsibility) 命令(Command) 迭代器(Iterator) 中介者(Mediator) 备忘录(Memento) 观察者(Observer) 状态(State) 策略(Strategy) 访问者(Visitor) |
学习顺序 | 设计模式 | 常用程度 | 适用层次 | 引入时机 | 结构复杂度 | 变化 | 实现 | 体现的原则 |
1 | Factory Method | 很常用 | 代码级 | 编码时 | 简单 | 子类的实例化 | 对象的创建工作延迟到子类 | 开闭原则 |
2 | Singleton | 很常用 | 代码级、应用级 | 设计时、编码时 | 简单 | 唯一实例 | 封装对象产生的个数 | |
3 | Facade | 很常用 | 应用级、构架级 | 设计时、编码时 | 简单 | 子系统的高层接口 | 封装子系统 | 开闭原则 |
4 | Template Method | 很常用 | 代码级 | 编码时、重构时 | 简单 | 算法子步骤的变化 | 封装算法结构 | 依赖倒置原则 |
5 | Abstract Factory | 比较常用 | 应用级 | 设计时 | 比较复杂 | 产品家族的扩展 | 封装产品族系列内容的创建 | 开闭原则 |
6 | Composite | 比较常用 | 代码级 | 编码时、重构时 | 比较复杂 | 复杂对象接口的统一 | 统一复杂对象的接口 | 里氏代换原则 |
7 | Proxy | 比较常用 | 应用级、构架级 | 设计时、编码时 | 简单 | 对象访问的变化 | 封装对象的访问过程 | 里氏代换原则 |
8 | Command | 比较常用 | 应用级 | 设计时、编码时 | 比较简单 | 请求的变化 | 封装行为对对象 | 开闭原则 |
9 | Observer | 比较常用 | 应用级、构架级 | 设计时、编码时 | 比较简单 | 通讯对象的变化 | 封装对象通知 | 开闭原则 |
10 | Strategy | 比较常用 | 应用级 | 设计时 | 一般 | 算法的变化 | 封装算法 | 里氏代换原则 |
11 | Builder | 一般 | 代码级 | 编码时 | 一般 | 对象组建的变化 | 封装对象的组建过程 | 开闭原则 |
12 | Adapter | 一般 | 代码级 | 重构时 | 一般 | 对象接口的变化 | 接口的转换 | |
13 | Bridge | 一般 | 代码级 | 设计时、编码时 | 一般 | 对象的多维度变化 | 分离接口以及实现 | 开闭原则 |
14 | Decorator | 一般 | 代码级 | 重构时 | 比较复杂 | 对象的组合职责 | 在稳定接口上扩展 | 开闭原则 |
15 | Iterator | 一般 | 代码级、应用级 | 编码时、重构时 | 比较简单 | 对象内部集合的变化 | 封装对象内部集合的使用 | 单一职责原则 |
16 | Mediator | 一般 | 应用级、构架级 | 编码时、重构时 | 一般 | 对象交互的变化 | 封装对象间的交互 | 开闭原则 |
17 | Memento | 一般 | 代码级 | 编码时 | 比较简单 | 状态的辅助保存 | 封装对象状态的变化 | 接口隔离原则 |
18 | State | 一般 | 应用级 | 设计时、编码时 | 一般 | 对象状态的变化 | 封装与状态相关的行为 | 单一职责原则 |
19 | Visitor | 一般 | 应用级 | 设计时 | 比较复杂 | 对象操作变化 | 封装对象操作变化 | 开闭原则 |
20 | Prototype | 不太常用 | 应用级 | 编码时、重构时 | 比较简单 | 实例化的类 | 封装对原型的拷贝 | 依赖倒置原则 |
21 | Flyweight | 不太常用 | 代码级、应用级 | 设计时 | 一般 | 系统开销的优化 | 封装对象的获取 | |
22 | Chain of Resp. | 不太常用 | 应用级、构架级 | 设计时、编码时 | 比较复杂 | 对象的请求过程 | 封装对象的责任范围 | |
23 | Interpreter | 不太常用 | 应用级 | 设计时 | 比较复杂 | 领域问题的变化 | 封装特定领域的变化 |