1994年, 四位作者Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides 出版了一本名为 “Design Patterns - Elements of Reusable Object-Oriented Software”(译作 “设计模式-可重用面向对象软件的基础”)的书, 该书开创了软件开发中设计模式的概念.
这些作者统称为四人帮(GOF). 根据这些作者的观点, 设计模式主要基于以下面向对象设计原则:
- Program to an interface not an implementation.(面向接口编程, 而不是针对实现编程)
- Favor object composition over inheritance.(优先对象组合, 而不是类继承)
我们所说的设计模式, 基本上是指 GOF 在书中说的那 23 种设计模式.
设计模式应该灵活运用, 不要刻板地套用某个设计模式, 应该理解设计原则, 应用设计原则, 同时把设计模式当做我们编码的参考.
我们运用设计模式的目标是: 为了让程序可扩展, 可复用, 结构清晰.
1 设计模式的类型
GOF 把 23 种设计模式分为三类: 创建型, 结构型 和 行为型.
- 创建型模式(Creational Patterns), 提供了一种 在隐藏创建逻辑的同时 创建对象的方法,而不是直接使用
new
操作符实例化对象. - 结构型模式(Structural Patterns), 如何组合类和对象以获得更大的结构和新的功能.
- 行为型模式(Behavioral Patterns), 关注对象间的通信.
创建型:
编号 | 设计模式 | 可变的方面 |
---|---|---|
1 | Abstract Factory | 产品对象家族 |
2 | Builder | 如何创建一个组合对象 |
3 | Factory Method(类) | 被实例化的子类 |
4 | Prototype | 被实例化的类 |
5 | Singleton | 一个类的唯一实例 |
结构型:
编号 | 设计模式 | 可变的方面 |
---|---|---|
1 | Adapter(类/对象) | 对象的接口 |
2 | Bridge | 对象的实现 |
3 | Composite | 一个对象的结构和组成 |
4 | Decorator | 对象的职责, 不生成子类 |
5 | Facade | 一个子系统的接口 |
6 | Flyweight | 对象的存储开销 |
7 | Proxy | 如何访问一个对象, 以及该对象的位置 |
行为型:
编号 | 设计模式 | 可变的方面 |
---|---|---|
1 | Chain of Responsibility | 满足一个请求的对象 |
2 | Command | 何时, 怎样满足一个请求 |
3 | Interpreter(类) | 一个语言的文法及解释 |
4 | Iterator | 如何遍历, 访问一个聚合的各个元素 |
5 | Mediator | 对象间怎样交互, 和谁交互 |
6 | Memento | 一个对象中哪些私有信息存放在该对象之外, 以及上面时候进行存储 |
7 | Observer | 多个对象依赖于另外一个对象, 而这些对象又如何保存一致 |
8 | State | 对象的状态 |
9 | Strategy | 算法 |
10 | Template Method(类) | 算法中的某些步骤 |
11 | Visitor | 默写可作用于一个(组)对象上的操作, 但不修改这些对象的类 |
注意:
有的模式用于类(称为 类模式), 有的用于对象(称为 对象模式).
类模式 处理类和子类之间的关系, 这些关系通过继承建立, 是静态的, 在编译时刻已经确定下来.
对象模式 处理对象间的关系, 这些关系 在运行时刻是可以变化的.
类模式 的设计模式很少, 只有 4 个(Factory Method, Adapter, Interpreter, Template Method), 已在上面的表格中标出.
Reference
[1]. Design Pattern - Overview
[2]. 设计模式-可重用面向对象软件的基础