1.5 什么是模式

    上面简要地介绍了模式的发展历史,但是,什么是模式呢?建筑师Christopher Alexander给出这样的定义。

    Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice.

    每一个模式都描述了一个在我们周围不断发生的问题,以及该问题的解决方案的核心,这样,你就能够无数次地使用该解决方案而不用按照同样的方式重做一遍。

    这个定义较长,一般情况下,模式被简单地定义为如下。

    A pattern is a solution to a problem in a context.

    模式是某一上下文环境中一个问题的解决方案。

    是的,模式就是一个解决方案,一个模式解决了一类特定的问题,当我们再次遇到同样的问题时,我们仍然可以使用它解决同样的问题。

    这个定义很容易让初学者认识什么是模式,但是很多人对此定义提出了异议,在“Head First Design Patterns”。[1]一书第13章中,作者就列举了一个例子驳斥了该概念。

    While an absentminded person might lock his keys in the car often, breaking the car window doesn't qualify as a solution that can be applied over and over(or at least isn't likely to if we balance the goal with another constraint:cost).

    一个健忘的人或许经常会把钥匙锁在汽车里,打破汽车的窗玻璃不是一个能够经常使用的解决方案(至少如果我们权衡另外一个限制条件——花费时,也极不可能使用)。

    是的,不是任何一个解决方案都能成为模式。在Christopher Alexander给出的定义里,就明确指出了,如果一个解决方案称得上是模式,那它要能够被使用无数次,经得起时间的考验。GoF为模式给出的定义如下所示。

    The design patterns,……,are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.

    设计模式,描述了在一个特定上下文环境,如何定制这些互相通信的对象和类来解决一个常见设计问题。

    可以看出,GoF给出的定义更加侧重于OOP编程设计。其实,我更愿意使用如下定义。

    A pattern is a general solution to a problem in a context.

    模式是某一上下文环境中一个问题的“常用”解决方案。

    模式是一个常用的解决方案(general solution),而非仅仅是一个solution,显然,打碎车窗玻璃并不能被看作是一个可以经常使用的解决方案。这个定义可以帮助读者简单但不失深刻地理解模式含义。

    为了方便这23个经典模式的交流和传播,GoF在书中为每个模式定义了4个基本要素。

    模式名称(Pattern name)

    问题(Problem)

    解决方案(Solution)

    效果(Consequence)

    这4个基本要素全面地描述了在特定的上下文,相关的类和对象如何协作来解决这些常见的问题。而本书并不会从这些要素入手去重复GoF的工作,而是通过一些场景,讨论如何使用这些模式,并尽力纵横扩展我们的视野,希望以此启发读者,为OOP开发设计打下坚实的基础。读者在阅读本书期间,可以参阅GoF—书以作全面了解。

    [1]参见Eric T Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra等人编写的“Head First Design Patterns”一书,出版社为O'Reilly Media,出版日期为October 2004。