关于本书

模式已经风靡整个软件开发社区。自从扛鼎之作《设计模式:可复用面向对象软件的基础》[GoF95]面世以来,软件开发人员对于模式满腔热忱。模式最早出现在软件成例[Cope92]、建筑结构模式[Ale79] [AIS77]以及人类学文化模式[Bat97]等相关早期作品中,接下来出版的作品,如《程序设计的模式语言》(PLoPD)系列 [PLoPD1] [PLoPD2] [PLoPD3] [PLoPD4]以及《模式系统》[POSA1]1等,更是推动这种对模式的高涨热情更上一层楼。

1 我们将《模式系统》简称为[POSA1],其间并未提及作者,对本卷也这样。我们将本卷简称为[POSA2]。这样做是为了避免读者将POSA 的某卷与某位作者尤其是第一作者联系起来。

本书为《面向模式的软件架构》(Pattern-Oriented Software Architecture,POSA)系列丛书的第2卷。同卷1《模式系统》[POSA1]类似,本书收录了诸多模式和最佳实践,由此阐释了实现高质量软件系统所需的久经考验的、具体的有用技术。书中的模式和最佳实践能够并且已经应用到各种不同的领域,包括电信和数据通信、金融服务、医疗工程、航空航天、制造工艺流程控制以及科学计算。上述这些模式和最佳实践还奠定了目前流行的分布式对象计算中间件的基础,例如CORBA [OMG98c]、COM+ [Box97]、Java RMI [WRW96]以及Jini [Sun99a]。

此外,本书所有模式同[POSA1]一样,都是建立在同样严密的概念基础之上。例如,我们使用了相同的模式分类方式和相同的模式描述格式,介绍了C++、Java 以及C 在内的多种编程语言方面的示例和已知应用。

因此,本书这一卷与上一卷秉承相同的思想体系和路线,具有同样的“观感”(look and feel)。

《模式系统》涵盖的通用模式范围非常广,而本书则与之相反,仅关注更为特定的领域:并发与联网。本书中的所有模式都以上述两个领域为中心,这样我们就能够更加深入地探讨许多并发与联网相关主题。如果本书收录很多不相关领域的模式,则无法达到这样深入的效果。在上述这些日益重要的软件开发领域中,本书中的模式对《模式系统》中的通用模式是一种补充。

但是,我们关注的是并发与网络应用程序和中间件中相关的通用、独立于领域的模式,目标是让本书中的模式尽可能地对你日常工作中的项目有所帮助。因此,本书并不涉及那些局限于特定应用领域的模式,比如[DeBr95] [Mes96] [ACGH+96]中的模式,这些模式解决网络方面的问题,但只适用于电信领域。

由于只关注通用的、独立于领域的并发与联网相关模式,本书还充实了现有的并发网络编程与面向对象设计方面的相关文献。

  • 并发网络编程文献通常只关注操作系统API 的语法与语义,比如Sockets [Ste98]、POSIXPthreads [Lew95]或者Win32 threads [Ric97],这些API 可以协调对主流操作系统上所提供的内核级通信框架的访问,比如System V STREAMS [Ris98] [Rago93]。作为补充,本书描述了如何在高质量的并发与联网系统的设计与编程中有效使用这些API。

  • 探讨解决上层软件设计与质量要素的文献[Boo94] [Mey97] [DLF93]通常不会关注并发与联网应用程序的开发,所以填补这一空白也是本书的主题。

[POSA2]与[POSA1]的另一个不同之处在于,[POSA2]描述的模式并不只是为了组成一个模式名录或者模式系统,这些模式还互相协作,互为支撑,为并发与联网软件相关的模式语言奠定了基础。本书在介绍其他模式文献中模式的基础上,描述了这种模式语言如何应用于构建复杂的并发与联网软件系统和应用程序、Web 服务、分布式对象计算中间件以及底层操作系统的网络协议与机制。

但是,我们会分开介绍每个模式以及它们是如何组成模式语言的。首先以自成一体的结构来描述模式本身,以便使这些模式能够应用于最有用的环境中。第1 章描述了模式之间如何交互以及如何与其他模式互为补充。

但需要注意的是,本书中的很多模式并不只应用于并发与联网环境中。为了举例说明这些模式的应用范围之广,我们介绍了其他领域中的应用,比如基于组件的软件系统或者交互式软件系统。另外,还给出了示例,说明如何在日常生活中应用这些模式。

由于某些模式的初始版本已经发表在PLoP 系列丛书[PLoPD1] [PLoPD2] [PLoPD3] [PLoPD4]和C++ Report 杂志上,所以它们可能看起来很眼熟,但是本书对这些早期版本做了大量的完善工作:

  • 首次将这些模式结集出版,突出了它们所表述的模式语言;
  • 基于在会议和研讨班上收到的许多改进建议(有电子邮件,也有来自内部的大量评审意见以及领头人作出的评论),我们对这些模式进行了大量的重写和修改;
  • 这些模式都已转换为POSA模式格式,并且描述风格一致。

目标读者

同已出版的[POSA1]类似,本卷的目标受众是专业的软件开发人员,尤其是那些开发并发与联网系统的专业软件开发人员。本书将帮助这些专业的软件从业人员以一种崭新的方式思考软件架构,为他们在大型复杂的中间件和应用程序的设计与编程中提供支持。

如果高年级本科生或者研究生在网络和操作系统方面具有坚实的知识基础,或者想学习有效设计和实现上述系统所需的核心原理、模式及技巧,那么本书同样适用。

结构与内容

本卷可以用作教科书,从头到尾进行阅读,或者用作参考指南,从而详细地探究具体模式的细微之处。

第1 章提纲挈领地介绍了开发人员在开发面向对象的并发与网络应用程序和中间件时所面临的挑战。我们使用了并发的Web 服务器程序作为现实中的示例,说明了这些领域中的关键点,包括服务访问与配置、事件处理、同步以及并发。

第2 章到第5 章构成了本书的主体。这4 章介绍的全部是“货真价实”的模式[U2],汇集了开发高质量的并发与联网系统所需的行之有效的原则与技巧。当你开发自己的并发与联网应用程序或者整理发现的模式时,我们希望这些模式能够作为实用的范例。

第6 章探讨了如何将第2 章至第5 章介绍的模式联系起来。我们还展示了如何将这些模式与文献中的其他模式联系在一起,为并发联网系统与中间件形成一种模式语言。前面提到,有些模式并不只能用于并发与联网系统环境。对于这样的模式,我们将概述其应用范围。

第7 章重温了我们1996 年关于“模式未来”的预测,该预测发表于[POSA1]。我们讨论了在过去四年里模式的实际发展方向,分析了模式以及模式社区的现状。在回顾上述内容的基础上,修正了模式以及模式语言未来研究与应用的前景。

本书最后是对所介绍模式的总结、常用术语表、符号附录、该领域相关工作的详细参考资料以及各种主题索引。

本书相关的补充材料可以在线访问http://www.posa.uci.edu,该URL 还提供了ACE 与TAO源码的链接,包含了本书所有模式的C++示例和一些Java 示例的源码。

毋庸置疑,有些并发与联网对象系统的相关方面我们略过未讲,有些模式则将随时间的流逝在应用和扩展模式语言的实践过程中出现。如果有任何评论、建设性的批评或者对本书风格与内容有任何改进意见,请发送电子邮件到patterns@mchp.siemens.de。同样欢迎公开讨论我们在模式方面所做的工作。请使用邮件列表siemens-patterns@cs.uiuc.edu 向我们发送反馈、评论和建议。

邮件列表的订阅指南可以在模式的主页上找到,其URL 为http://hillside.net/patterns/。该链接还提供了很多模式方面的重要信息来源,例如已经出版和即将出版的书籍、模式方面的会议信息与发表的论文等。

模式抢先看

服务访问和配置模式

Wrapper Facade 设计模式将既有的非面向对象API 提供的函数和数据封装到面向对象的类接口中,后者更简洁、更健壮,可移植性、可维护性和内聚性更高。

Component Configurator 设计模式让应用程序能够在运行阶段加载和卸载组件实现,而无需修改、重新编译和静态地重新链接应用程序。Component Configurator 还支持将组件重新分配到其他进程中,而无需关闭并重启正在运行的进程。

Interceptor 架构模式使得可以透明地给框架添加服务,并在特定事件发生时自动触发它们。

Extension Interface 设计模式让组件能够导出多个接口,从而避免因开发人员扩展或修改既有组件的服务功能,导致接口“膨胀”及客户端代码失效。

事件处理模式

使用Reactor 架构模式,事件驱动的应用程序可以分离并分派从一个或多个客户端发送到应用的服务请求。

Proactor 架构模式能够高效地为事件驱动应用程序分离及分派由异步操作完成触发的服务请求。该模式既提供了并发的性能优势,又不会产生不良后果。

使用Asynchronous Completion Token 设计模式,应用程序能够高效地分离并处理异步操作的响应,这些异步操作由应用程序在服务中进行调用。

Acceptor-Connector 设计模式将网络系统中互相协作的端服务的连接与初始化,同之后的处理分离。

同步模式

无论控制代码从一个作用域的返回路径如何,Scoped Locking C++成例都能确保:当控制代码进入该作用域时,能够自动获取到锁;当控制代码离开该作用域时,能够自动释放锁。

Strategized Locking 设计模式对组件中使用的同步机制进行参数化,保护对组件临界区的并发访问。

Thread-Safe Interface 设计模式。将锁定的开销降到最低,并且确保组件内的方法调用不会导致“自我死锁”,自我死锁发生于试图重新获取组件已经持有锁的情况下。

在程序执行期间,每当代码的临界区必须以线程安全的方式,只进行一次获取锁操作时,Double-Checked Locking Optimization 设计模式可以降低竞争和同步的开销。

并发模式

Active Object 设计模式将方法执行和方法调用分离,旨在改善并发性、简化对位于独立控制线程中的对象的同步访问。

Monitor Object 设计模式同步同时调用的方法,确保每次只运行对象的一个方法。它还让对象的方法相互协调,以确定它们的执行顺序。

Half-Sync/Half-Async 架构模式将并发系统中的异步处理和同步处理分离,以简化编程工作,同时又不降低性能。它引入了两个相互通信的层,一层处理异步服务,另一层处理同步服务。

Leader/Followers 架构模式提供了一个高效的并发模型,其中多个线程轮流检测一组事件源,对其发出的服务请求进行分离、分派和处理。

Thread-Specific Storage 设计模式让多个线程能够使用相同的“逻辑全局”访问点来获取线程本地的对象,避免了每次访问对象的锁定开销。

致谢

很高兴能够向支持我们完成本书创作的一些人表示感谢,感谢你们分享知识,也感谢你们审阅本书各部分的早期手稿,并提供宝贵的反馈意见。

评审冠军的桂冠颁发给我们尊敬的同事们:Regine Meunier、Christa Schwanninger、Martin Botzler、Lutz Dominick、Prashant Jain、Michael Kircher、Karl Pröse 以及 Dietmar Schütz。我们曾经召开了无数次作者讨论会,他们在讨论会上花费了大量的宝贵时间帮助我们审阅手稿,对本书内容精雕细琢,最终使本书定稿。同样要感谢分布式对象计算(DOC)组成员Tim Harrison、Prashant Jain、 Carlos O’Ryan 以及 Irfan Pyarali,他们是本书六个模式初始版本的作者。来自慕尼黑西门子公司、圣路易斯华盛顿大学以及加州大学欧文分校的研究人员,同本书的四个主要作者一起组成了整个POSA 写作团队。

我们还要向Peter Sommerlad、Chris Cleeland、Kevlin Henney 以及Paul McKenney 表示最诚挚的感谢。Peter 作为我们的管家,关注材料的正确性、完整性、一致性和质量,细致入微地审阅了所有材料。Chris、Kevlin 以及Paul 担任我们的同行评审人,提供了更多的详细反馈。他们四人为提高本卷的质量贡献卓著。

我们还要向伊利诺伊大学香槟分校的软件架构组表示感谢,其成员包括Federico Balaguer、John Brant、Brian Foote、Alejandra Garrido、Peter Hatch、Ralph Johnson、Dragos Manolescu、Brian Marick、Hiroaki Nakamura、Reza Razavi、Don Roberts、Les Tyrrell、Joseph W. Yoder、Wanghong Yuan、Weerasak Witthawaskul 以及Bosko Zivaljevic,他们就很多POSA2 模式举办了多次作者研讨会,反馈了很多宝贵意见,帮助我们对本书内容去伪存真,使其通俗易懂。

来自世界各地的很多其他朋友反馈了对本书早期版本的宝贵意见,他们是Giorgio Angiolini、Brad Appleton、Paul Asman、David Barkken、John Basrai、Joe Bergin、Rainer Blome、Don Box、Martina Buschmann、Tom Cargill、Chuck and Lorrie Cranor、James O. Coplien、Ward Cunningham、Gisela Ebner、Ed Fernandez、Erich Gamma、Sonja Gary、Luciano Gerber、Bob Hanmer、Neil Harrison、Michi Henning、David Holmes、Tom Jordan、Fabio Kon、Bob Laferriere、Greg Lavender、Doug Lea、John MacMillan、Mittal Monani、Duane Murphy、Jaco van der Merwe、Michael Ogg、Bill Pugh、Dirk Riehle、Linda Rising、Wolfgang Schroeder、Richard Toren、Siva Vaddepuri、John Vlissides、Roger Whitney 以及 Uwe Zdun。每章模式的“致谢”部分概述了他们为润色本书所做出的宝贵贡献。

我们万分感谢那些来自圣路易斯华盛顿大学、加州大学欧文分校、Object Computing Inc.以及 Riverace 的DOC 组员。他们将本书所讲的所有模式具体化,完善优化应用到ACE 及TAO 中间件项目的组件与框架中。这些带给我们启示的组员有Everett Anderson、Alex Arulanthu、Shawn Atkins、Darrell Brunsch、Luther Baker、Matt Braun、Chris Cleeland、Angelo Corsaro、Sergio Flores-Gaitan、Chris Gill、Pradeep Gore、Andy Gokhale、Priyanka Gontla、Myrna Harbison、Tim Harrison、Shawn Hannan、John Heitmann、Joe Hoffert、James Hu、Steve Huston、Prashant Jain、Vishal Kachroo、Ray Klefstad、Yamuna Krishnamurthy、Michael Kircher、Fred Kuhns、David Levine、Ebrahim Moshiri、Michael Moran、Sumedh Mungee、Bala Natarjan、Ossama Othman、Jeff Parsons、Kirthika Parameswaran、Krish Pathayapura、Irfan Pyarali、Carlos O’Ryan、Malcolm Spence、Marina Spivak、Naga Surendran、Selcuk Uelker、Nanbor Wang、Seth Widoff 以及 Torben Worm。我们还想向来自世界各地成千上万的ACE 和TAO 用户所做出的巨大贡献表示感谢。在过去的十年里,他们一直在使用并优化本书描述的模式和框架组件。没有他们的支持、持续的反馈和鼓励,也不会有本书。

特别感谢Johannes Nierwetberg、Lothar Borrmann 以及 Monika Gonauser,感谢他们在德国慕尼黑西门子AG 企业技术软件工程实验室所给予的管理上的帮助与支持。我们还要感谢慕尼黑西门子AG 通信设备业务部门的Calinel Pasteanu,感谢他对本书写作的繁杂与快速发布产品的压力的理解。

我们还要感谢同事们和赞助商们对于研究模式以及ACE 与TAO 中间件框架的支持,尤其感谢下列人员:Ron Akers(Motorola)、Al Aho(Lucent)、Steve Bachinsky(SAIC)、Detlef Becker(Siemens)、Jim Blaine(Washington University)、John Buttitto(Motorola)、Becky Callison(Boeing)、Wei Chiang(Nokia)、Russ Claus(NASA)、Joe Cross(Lockheed Martin)、Bryan Doerr(Boeing) Karlheinz Dorn(Siemens)、Sylvester Fernandez(Lockheed Martin)、Andreas Geisler(Siemens)、Helen Gill(DARPA)、Trey Grubbs(Raytheon)、Jody Hagins(ATD)、Andy Harvey(Cisco)、Thomas Heimke(Siemens)、Kalai Kalaichelvan(Nortel)、Arvind Kaushal(Motorola)、Steve Kay(Tellabs)、Chandra Kintala(Lucent)、Gary Koob(DARPA)、Sean Landis(Motorola)、Rick Lett(Sprint)、Joe Loyall(BBN)、Mike Masters(NSWC)、Ed Mays(US Marine Corps)、John Mellby(Raytheon)、Dave Meyer(Virtual Technology)、Eileen Miller(Lucent)、Stan Moyer(Telcordia)、Russ Noseworthy(Object Sciences)、Guru Parulkar(Cisco)、Dan Paulish(Siemens)、James Plamondon(Microsoft)、Dieter Quehl(Siemens)、Lucie Robillard(US Air Force)、Allyn Romanow(Cisco)、Rick Schantz (BBN)、Steve Shaffer(Kodak)、Dave Sharp(Boeing)、Naval Sodha(Ericsson)、Brian Stacey (Nortel)、Paul Stephenson(Ericsson)、Umar Syyid(Hughes)、Dave Thomas(OTI)、Lothar Werzinger(Krones)、Shalini Yajnik(Lucent)以及 Tom Ziomek(Motorola)。

特别感谢文字编辑Steve Rickaby 对书稿的润色。另外,我们要感谢编辑Gaynor Redvers-Mutton 以及John Wiley & Sons 出版社的其他人员,没有他们就没有本书。这是Gaynor 与Steve负责出版的第二本书。他们的支持无与伦比,我们期待未来继续合作出版后续的POSA 系列书籍。

最后,我们向已故的Richard Stevens 致以最深切的感谢。多年以前是他的启蒙书籍引导我们走进网络编程的神奇世界,他的精神渗透于本书的字里行间。

目录

  • 关于本书
  • 阅读指南
  • 第1章 并发与联网对象
  • 第2章 服务访问和配置模式
  • 第3章 事件处理模式
  • 第4章 同步模式
  • 第5章 并发模式
  • 第6章 模式的综合运用
  • 第7章 模式的过去、现在及未来
  • 第8章 结束语
  • 参考文献
  • 索引