从设计模式到体系结构模式
                            --评读《面向模式的软件体系结构 卷1:模式系统》
                                       王知遇
  这是1997年来自英国CVu的一句评价:"《设计模式》已是一本广为传阅的经典著作,我认为《面向模式的软件体系结构》也应该成为经典。《设计模式》覆盖了面向对象开发中的一个抽象层,而这本书覆盖了三个层次:高层体系结构模式,设计模式和语言特定的惯用法。"
  正是这句话引起了我的浓厚兴趣。众所周知,模式近期已引起了国内的广泛关注,人们通过各种形式对其进行讨论,文章、书评、研讨班、网站,如雨后春笋,并由此而引发了一轮关切软件工程的热潮,而这一切都源于一本书《设计模式》。模式之所以让人如此心动,是因为软件开发经历了数年的"手工业"发展之后,人们开始认识到应该有一些方法和经验来提高自己的工作效率。《设计模式》的四位专家较早地意识到了这个问题,当时人们对许多重复的设计问题已有了一定的解决方案,这个行业的发展是如此之快,不断涌入后来者和年轻人,于是他们以最容易传播的方式(图书出版)和最良好的书写格式(规范形式)记载了这些解决方案。这种以规范形式记录设计知识可以追溯到Christopher Alexander,此君在建筑学中率先提出模式概念。他的潜在意念是,居住位置的设计不仅在于功能和流行,也在于舒适和安慰。良好设计的建筑能清楚地体现其内在质量,但很难描述和量化。简而言之,这样的建筑拥有"没有名称的质量"。
  模式是什么?《面向模式的软件体系结构》(简写为POSA)的作者提出了一个模式的组成结构图,这个结构图紧紧地抓住了模式得以独立于领域的本质。
  作者也同样关注面向对象以外的问题,并在书中融入了对模式描述技术的最新认识。该书的整体目标是,使用模式有助于软件体系结构的大范围语境。于是,这种方式就被称作"面向模式的软件体系结构"。作者的看法是,模式不仅仅被储存在不同种类的容器当中,还应该根据相应的标准进行分类,这就是"模式系统"。GoF通过把模式划分为"创建型","结构型"和"行为型"等进行分类,而《面向模式的软件体系结构》则根据已获得的更好的标准(如交互式和适应性系统、工作组织、通信和访问控制等)来对模式分类。
  然而需要强调的是,开发"模式风格"理论并不是这本书的主要目标。当1991年作者以一种直截了当的方式记录了第一个模式之后,很快就发现单个模式是不能单独存在的,随着模式系统文档的日益增多,更显示出单个模式的缺陷。作者提到,出版该书的驱动因素之一就是,模式揭示了丰富的相互关系集。无可否认,这是一部比之《设计模式》更为出色、更为成熟的经典作品。在Amazon.com上,读者如此评价《面向模式的软件体系结构》一书"关于模式的一本杰作。该书是《设计模式》(GoF著)的完美伴侣","一本适用于每一种软件体系结构的著作...它确实能使我们缩短所需的设计时间","这是一本特别的模式专著...因为有人宣称GoF书是二十世纪九十年代最重要的编程书籍,我则认为,我不得不同意...本书是一本更加深入、更加成熟的著作。"
  GoF的著作专注于设计层次模式,而该书的模式跨越几个抽象层次。Amazon.com如此评价"为了从软件工程的更大范围内获得模式潜力的远景...本书指出了模式如何应用于各个层次,从用于特定计算机语言(如C++)的惯用法到设计模式,再到对改善整个软件工程周期都有用的更高层模式。"每位开发人员都会面临的最基本的分类问题--模式种类,书中把他们由高至低分为体系结构模式,设计模式和惯用法三类:
   体系结构模式是最高层次模式,当具体指定应用的基本结构时,它可用于开始阶段的粗粒度设计中。
   设计模式适用于粗粒度设计的结束阶段,如用于需要细化并且扩展软件系统的基本体系结构之时。例如,决定子系统之间的基本通信机制。设计模式在指定局部设计方面同样适用于详细设计阶段,例如对组件的多种实现所需要的支持。
   惯用法处于最底层,即是在实现阶段将软件体系结构转换成使用某种专用语言而编写程序的一些方法。大多数惯用法是与具体语言密切相关的,关注于设计和实现。例如,C++使用引用-计数惯用法来管理动态分配的资源;Smalltalk提供碎片收集机制。近来不断地涌现出总结惯用法的好书,如《Effective C++》、《Effective Java》等,后者是2002年美国著名的《开发杂志》评选最佳图书的头名,继C++、Smalltalk之后关于惯用法在程序设计领域的又一重要总结。
  在《面向模式的软件体系结构 卷1:模式系统》一书中提到的模式系统,只包括那些在软件开发过程中具有通用特性的模式,并不提供特定领域的模式(该书的第2卷"并发和网络化"则关注那些用于并发和网络化应用程序和中间件的通用的、与领域无关的模式)。作者在书中定义了一个新的问题分类,例如为组件创建定义新的问题分类,新问题的分类可用于形成一个扩展的模式系统:
  创建:包括帮助实例化对象和递归对象结构的模式。
  服务变体:包括支持对象或组件行为改变的模式。
  服务扩展:包括帮助动态地给对象或对象结构添加新服务的模式。
  适应:提供接口和数据转换的模式。
  所有的GoF设计模式都被分派到已有的问题分类之中,书中随后总结出一个极为精彩的表格,GoF模式用斜体显示。
 
体系结构模式
设计模式
惯用法
从混沌到结构

管道和过滤器黑板
解释器
分布式系统
代理者
管道和过滤器
微核
交互式系统
MVC
PAC
适应性系统
微核
映像
创建  
抽象工厂
原型
建造者
单件
工厂方法
结构化分解  
整体-部分
组合
工作的组织  
主控-从属
职责链
命令
中介者
访问控制  
代理
外观
迭代器
服务变化  
网桥
策略
状态
模板方法
服务扩展  
装饰
访问者
管理  
命令处理器视
图处理程序
备忘录
适应  
适配器
通信  
出版者-订阅者
转发器-接收器
客户机-分配器-服务器
资源处理  
享元
计数指针

  不得不提的是,这本书的编排使得读者能够选择适合自己的阅读方式。全书分为8章,前四章分别为模式,体系结构模式,设计模式,惯用法;后四章是模式系统,模式和软件体系结构,模式团体,模式将走向何方。第1章"模式"是全书的导引,作者对软件体系结构进行了全面的介绍,系统地介绍了模式的概念并讨论了模式描述的原则。这是每个人都应该仔细阅读并加以体会的一章,从中还可以了解某个特定模式的关键思路。
  其中,第2章和第3章是全书的重点,引荐了来自不同应用领域的8个体系结构模式。第3章给出了8个设计模式,所有的这些模式都分别针对在定义了软件系统的整体结构之后所遇到的典型问题。例如,我们的设计模式用结构化组件来处理存在于组件间工作量分配和组织组件间通信的复杂性。如果读者以前不了解模式,可以首先选择书中最基本和最简单的那些模式进行阅读,包括:管道和过滤器体系结构模式(第2章)、代理设计模式(第3章)和转发器-接收器设计模式(第3章)。
第4章是模式内容的第三部分也是最后一部分。该章处理惯用法,一种与具体语言相关的模式,这一章并非是叙述的重点,仅仅提供了一个惯用法作为具体实例来说明问题。
  这本书最值得称道的用处是,可以利用它去查找你在当前工程中所遇到的设计问题的解决方案。读者可以把第5章"模式系统"作为研究的指南,然后再去查看那些被确认是潜在解决方案的模式的细节。这一章也是十分重要的,对于弄清楚三种模式之间的关系及其适用范围,尤为重要。
  第6章是关于模式如何嵌入到软件体系结构中的内容。书中特别讨论了对软件体系结构及其基本原则的理解,并向读者展示了模式是如何支持这些原则的。第7章是有关模式历史,相关工作和整个模式团体。结束本书前,第8章则给出了对模式未来的发展展望。该书附录内容也十分完备,包括符号表、常用词汇表、参考文献和模式索引。
  这是一本帮助软件开发员用一种新的眼光去考虑软件体系结构问题的参考指南,书中提供了一些技术来解决特定的再现设计问题。而把本书用作软件工程课程的教材,则可以给学生形成大型软件设计的完整的新观点。另一方面,这本书它可以使读者迅速地学习到软件界多年来积累下来的宝贵经验。这是关于软件体系结构模式的第一本开创性著作,任何一位认真的程序员都应该仔细阅读。
  TOP