序言
1999年的春天,我乘机到了芝加哥为ThoughtWorks公司的一个项目作顾问。这是一个正在
迅速扩展中的小型的软件设计公司。而这个项目正是那些充满雄心壮志的企业应用项目之
一:一个后台的房屋租赁系统。基本上这个系统要做的东西是你在签定合同后要做的所有
事情。它必须能够发送帐单,在有人对租用的房产升级时能做适当处理,对没有按时交租
的人进行追讨,还要在有人提早退租时算出准确的费用。这初时听起来并不难,直到你意
识到租赁协议是可以无限的多样化和可怕的复杂。业务“逻辑”很少会符合任何一种逻辑
模式,因为毕竟这是由业务人员写出来寻求商机的。在商业环境中,各种小而临时的变动
可能会对赢得一场交易起决定性的作用。但每一个这样的小变动都会大大增加软件系统的
复杂性。
这种正是能令我感到兴奋的一类事情。怎样把握住所有的这些复杂性,并设计出一个合适
的对象系统使得事情变得更易处理。为这个系统开发一个好的Domain Model(业务模型,
就是一个实例对应一条数据库里记录的对象)是件非常困难,但能带来极大满足感的事。
但这还不是所有的问题。例如,一个业务模型必须持久保存在数据库中,而且正如许多其
他的项目,我们使用的是关系型数据库。我们还必须把这些业务模型连接到一个用户界面,
提供允许远程访问我们的软件的支持,并且把我们的软件与第三方提供的软件包整合起来。
所有的这些东西都运用了一种叫作J2EE的,至今还没有人称得上有真正使用经验的技术。
虽然这个技术在当时非常新,但我们仍然在以往的经验中得到不少好处。我们曾经使用C++,
Smalltalk和CORBA来完成这类事情,而大部分ThoughtWorker里的员工对使用Forte有丰富
的经验。我们脑海中其实已经对关键的架构有所认识,只需要解决如何在J2EE上实现的问题
了。三年之后回望这个系统,它的设计并不完美,但它很成功地经受了时间的考验。
这个例子就是这本书所关注的其中一种情形。这几年来我看过许多的企业应用项目。 这些
项目常常包含了相近的设计思想,这些设计思想被证明是解决那些企业应用程序不可避免要
处理的复杂问题的有效方法。这本书是要作一个初步的尝试,去把这些设计思想抽取出来
作为设计模式。
这本书分成两部分。第一部分是一系列的叙述性章节,它们是一些关于企业应用程序设计
的重要话题。这些章节介绍了各种在企业应用程序架构时会遇到的问题和它们的解决方案。
但是这些叙述性的章节并不会对这些解决方案进行详细的讲解。解决方案的细节将会放到
第二部分,它们被组织成一个个模式。这些模式是用作参考的,我并不希望你从头到尾按
顺序读完它们。我的意图是你能够从头到尾读完在第一部分的叙述性章节,对本书所讲的
东西有一个整体的印象。然后,你就可以根据你的兴趣和需要,对第二部分的模式选择性
地进行稍微深入的研究。可以说,本书是一本短小的叙述书和一本较长的参考书的结合体。
这是一本关于企业应用程序设计的书。企业应用程序涉及到显示,处理和储存大量的往往
是很复杂的数据。企业应用程序的例子包括预约系统,金融系统,供应链系统,和许多为
现代商业而设计系统。企业应用程序会有它们自己特定的挑战和解决方案。它们与嵌入式
系统,控制系统,电信系统,或者桌面生产系统。所以,如果你是从事这些其他领域的开
发人员,那么这本书中并没有你真正想要的东西。(除非你想知道企业应用程序看起来象
什么)。
在开发企业应用中遇到的架构性问题有很多。我恐怕这本书并不会对它们作全面的指导。
在软件开发方面,我是迭代开发的忠实支持者。迭代式开发的核心观念是一旦你加入了对
用户有用的功能,你就应该分发你的软件,就算它还不完整也无所谓。虽然写书和写软件
有着很多不同,但在迭代开发这点上我觉得两者应该是一样的。因此这本书是一个不完整
但(我相信)有用的关于企业应用程序架构的纲要。我在书里将要讲述的主要话题有:
1)企业应用程序的分层
2)怎样构建业务逻辑
3)WEB用户界面的结构
4)怎样把内存模块(一般来说指对象)与关系型数据库联系起来
5)怎样在无状态的环境(stateless environments)里处理会话状态(session state)
6)一些关于分布式的原则
(译注:略去关于本书没有谈到话题的列表)
这本书并不针对某种语言平台。我开始时是在80年代末90年代初时在SMALLTALK,C++,和
CORBA平台上使用这些模式。在90年代末,我开始使用JAVA做更多的工作,并发现这些模式
在早期的JAVA/CORBA系统和后来的基于J2EE的工作中都能很好地应用。最近,我开始使用
微软的.NET平台并发现这些模式仍然适用。而我在ThoughtWorks的同事也把这些模式和他
们以往使用Forte的经验结合起来。我并不能肯定这些模式在所有已有或将来的语言平台上
都有用,但至今为止,这些模式已经被足够的应用实例证明是有用的。
我对大部分的这些模式都提供了例程。我对例程语言的选择是基于我认为哪种语言看起来
能够被大部分的读者理解。JAVA是一个很好的选择。任何能读懂C或C++的人都能读懂JAVA,
但是JAVA比起C++来讲简单很多。基本上大多数的C++程序员能读JAVA代码但反之不然。我
是一个面向对象的顽固党,因此不可避免地会倾向于面向对象的语言。所以大部分例程使
用JAVA。当我正在写这本书的时候,微软开始了完善他们的.NET环境,他们的C#语言有着
许多与JAVA相同的特性。因此某些例程也使用C#编写,虽然,这种做法引入了一些风险,
因为开发者们对.NET环境还没有太多的经验而且关于使用它的许多术语还不够成熟.但即使
你对某种语言或平台了解不深,由于它们都是基于C的语言,因此你如果你读懂它们其中的一
种,你就能读懂其他的。我的目的是使用一种大部分软件开发人员都能读懂的语言,尽管这
种语言不一定是他们平时主要使用的语言或最喜欢的语言。(我对那些喜欢Smalltalk,
Delphi, Visual Basic, Perl, Python, Ruby, COBOL或者任何其他语言的人表示歉意。
我知道你们觉得你在使用一种比JAVA或者C#要好的语言,我能够说的只是:我赞同你们
的看法)