设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相
关的对象,以适当的粒度将它们归类,再定义类的接口和继承层次,建立对象之间的基本关
系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。
你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下
子就得到复用性和灵活性好的设计,即使不是不可能的至少也是非常困难的。一个设计在最
终完成之前常要被复用好几次,而且每一次都有所修改。
有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总
是求助于以前使用过的非面向对象技术。新手需要花费较长时间领会良好的面向对象设计是
怎么回事。有经验的设计者显然知道一些新手所不知道的东西,这又是什么呢?
内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解
决方案。当找到一个好的解决方案,他们会一遍又一遍地使用。这些经验是他们成为内行的
部分原因。因此,你会在许多面向对象系统中看到类和相互通信的对象( c o m m u n i c a t i n g
o b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复
用性更好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。
一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。
以下类比可以帮助说明这一点。小说家和剧本作家很少从头开始设计剧情。他们总是沿
袭一些业已存在的模式,像“悲剧性英雄”模式(《麦克白》、《哈姆雷特》等)或“浪漫小说”
模式(存在着无数浪漫小说)。同样地,面向对象设计员也沿袭一些模式,像“用对象表示状态”
和“修饰对象以便于你能容易地添加/删除属性”等。一旦懂得了模式,许多设计决策自然而
然就产生了。
我们都知道设计经验的重要价值。你曾经多少次有过这种感觉—你已经解决过了一个问
题但就是不能确切知道是在什么地方或怎么解决的?如果你能记起以前问题的细节和怎么解
决它的,你就可以复用以前的经验而不需要重新发现它。然而,我们并没有很好记录下可供
他人使用的软件设计经验。
这本书的目的就是将面向对象软件的设计经验作为设计模式记录下来。每一个设计模式
系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。我们的目标是将
设计经验以人们能够有效利用的形式记录下来。鉴于此目的,我们编写了一些最重要的设计
模式,并以编目分类的形式将它们展现出来。
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述
成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式帮助你做出有利于系统
复用的选择,避免设计损害了系统复用性。通过提供一个显式类和对象作用关系以及它们之
间潜在联系的说明规范,设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。
简而言之,设计模式可以帮助设计者更快更好地完成系统设计。
本书中涉及的设计模式并不描述新的或未经证实的设计,我们只收录那些在不同系统中
多次使用过的成功设计。这些设计的绝大部分以往并无文档记录,它们或是来源于面向对象
设计者圈子里的非正式交流,或是来源于某些成功的面向对象系统的某些部分,但对设计新
手来说,这些东西是很难学得到的。尽管这些设计不包含新的思路,但我们用一种新的、便
于理解的方式将其展现给读者,即:具有统一格式的、已分类编目的若干组设计模式。
尽管该书涉及较多的内容,但书中讨论的设计模式仅仅包含了一个设计行家所知道的部
分。书中没有讨论与并发或分布式或实时程序设计有关的模式,也没有收录面向特定应用领
域的模式。本书并不准备告诉你怎样构造用户界面、怎样写设备驱动程序或怎样使用面向对
象数据库,这些方面都有自己的模式,将这些模式分类编目也是件很有意义的事。
1