10.2 模式分类
“四人帮”讨论了23个模式,按照下面3种目的分类(对所有模式都围绕可能变化的特定方面考虑):
1)创建型(Creational):用于怎样创建一个对象。通常包括隔离对象创建的细节,这样代码不依赖于对象是什么类型,因此在增加一种新的对象类型时不需要改变代码。本章将介绍单件(Singleton)模式、工厂(Factory)模式和构建器(Builder)模式。
2)结构型(Structural):影响对象之间的连接方式,确保系统的变化不需要改变对象间的连接。结构型模式常常由工程项目限制条件来支配。本章中将看到代理(Proxy)模式和适配器(Adapter)模式。
3)行为型(Behavioral):在程序中处理具有特定操作类型的对象。这些对象封装要执行的操作过程,比如解释一种语言、实践一个请求、遍历一个序列(如像在一个迭代器内)或者实现一个算法。本章包含命令(Command)模式、模板方法(Template Method)模式、状态(State)模式、策略(Strategy)模式、职责链(Chain of Responsibility)模式、观察者(Observer)模式、多派遣(Multiple Dispatching)模式和访问者(Visitor)模式的例子。
“四人帮”对23个模式的每个模式都用一节篇幅进行讨论,给出一个或多个例子,这些例子通常用C++描述,有时也用Smalltalk描述。本书不重复在“四人帮”书中阐述的那些模式的细节,既然那本书自成体系,就应该单独学习。在此提供的描述和例子旨在给读者一个关于模式的大致理解,以便对模式是什么和模式的重要性有一个感性的认识。
特征、习语和模式
接下来的内容已经超出“四人帮”书中的范围。自从“四人帮”的书出版以来,出现了更多的模式,对于定义设计模式有了更细致的过程。[1]这是重要的,因为识别新的模式或适当地描述它们是不容易的。例如,对于什么是设计模式,在流行的文献中有一些混乱的定义和描述。模式不是琐碎的,它们通常也不是由某种编程语言中内部特征来表现。例如,构造函数和析构函数可以被称为“保证初始化和清除的设计模式”。对面向对象编程来说,这些是重要的和必要的结构,但它们是常规语言的特征,还没有丰富到足以被看成设计模式的地步。
另外一个非模式的例子就是来自各种形式的聚合。聚合是面向对象编程中的一个完全基本的原则:用一些对象制造另一些对象。然而,有时这种办法被错误地归类为一种模式。这是遗憾的,因为它打乱了设计模式的思想,暗示人们将第1次看到且感到惊奇的任何事物都归结为一种设计模式。
Java语言提供了另外一个使人误解的例子:JavaBeans规格说明的设计者决定把简单的“get/set”命名约定称为一种设计模式(比如,getInfo()返回一个Info属性,而setInfo()改变这个属性)。这只是一个普通的命名约定,而不能构成设计模式。
[1]最新信息查询请登录http://hillside.net/patterns。