实用J2EE设计模式编程指南 这里,粒度起着重要作用。选择组件的适当粒度可以规定所需的通信量,这在分布式 应用程序中特别重要(J2EE应用程序是分布式应用程序)。选择组件的适当粒度可以使应 程序性能更好。 粒度选择反映在组件接口中。J2EE是个分布式平台,严格遵照接口与实现分开的概念, 减少客户机与组件之间的依赖性,从而提高灵活性。客户机只依赖于接口,因此不知道组件 实现的改变。这样就叮以改变组件实现而不影响客户机。这个概念对分布和集成非常重要 但是,要得到这些好处,就不能改变接口。这就要求尽力设计接口,保证近期内不会 发生改变。设计模式可以定义具有适当粒度与签名的接口。 设计模式还可以提供视图管理体系结构,帮助设计灵活的表示层组件,适应将来的修 改和集中执行特定工作,如用户验证、授权和个性化,还可以分开请求处理与视图生成,从 而进一步增加灵活性。 设计模式还可以促进复用。软件开发中的复用巳经有较长的历史,从简单源代码复 进化到表示问题抽象的结构复用,以及表示问题解决思路的结构复用。模式就是复用思想, 已被证明是成功的方法,是思想复用的催化剂。设计模式还可以帮助我们使设计更适合低级 复用,复用组件与对象。从这个意义上说,模式也许是最成功的复用形式之一 最后,设计模式还可以提高设计灵活性,更好地适应将来的改变。软件开发中的需求 是迅速变化的。好的软件设计可以预期这些改变,但要求根据领域中不易发生改变的项目进 行设计,要求从开始就预见将来可能的改变。这样可以大大减少重新设计。 般设计模式和J2EE设计模式可以避免这些情形。如果使用设计模式,则可以使体 结构更加灵活。这是因为,每种设计模式定义了一般方案,可以独立改变某些方面。 雲实现设计模式的这些好处,就要选择适当的设计模式。因此,下节介绍如何选择适 当的设计模式 选择适当的设计模式 近年来,设计模式不断增加,因此选择适当的模式并不容易,特别是类别中列出不熟 悉的设计模式时更是如此。选择适当的模式非常重要,因为如果不针对问题选择模式,就得 不到设计模式应有的好处。因此,使用模式类别之前,要先仔细研究和了解所有模式 了解所有模式之后,仍然可能在特定设计问题中找到多种选择。例如,要隐藏业务 辑层细节和分离EJB与客户机之间的通信,J2EE模式类别中至少列出了三个相似的模式 Session Facade、 Message Facade和 EJB Command。然后我们可以采用几种不同方法寻找 与选择适当的模式。下面介绍其中一些方法 模式类别通常根据用途组织模式,不难找到适当的组。然后可以分析这个组中的模 式,选择最适合的设计模式 对每个设计模式,找到这个模式解决的设计问题,从而缩小具体问题可用的设计模 式 阅读每个模式描述的问题和解部分。问题部分有助于标识适合的模式,然后可以根 据解部分进行最后选择
第1章J2EE设计模式 确定模式之间的相关性。可以用关系选择可用模式组 ·-个冇用的方法是考虑设计中的可变参数。应确定可以改变什么而不必重新设计, 包装变化概念”在诈多模式中定义。了解之后,就可以根据这个条件迭择适当的 模式 相反的方法是标识重新设计的原因。我们要标识造成重新设计的原因,然后找到避 免这些原因的模式 活动框图1.1显示了上述步骤。 找到适当的模式组 我到这个模 阅读每个模式摄还 的回题和解部 确定模式之间的相关性 考虑设计中的可变参数 标识重新设计的原因 初看起来,这些步骤好象很复杂,但本书提供了丰富的准则,可以帮你进行模式选择 对模式越熟悉,就越容易进行模式选择。 下面看看进行模式选择之后如何使用设计模式 使用设计模式 要得到设计模式的好处,一定要进行正确的模式选择,更重要的是正确应用选择的设 计模式,否则就无法得到设计模式的好处。 要有效利用设计模式,应遵循下列准则 ·使用模式之前,应完全了解设计模式。这就要求分析解部分,了解参与模式的所有 件、类与对象及其相互关系,还要熟悉策略部分,了解不同情形中采用模式的准则 再次检査是査选择了适当的模式。应认真分析模式描述,特別是后果j相关模式部分 ·应检查采用模式部分,认真分析例∫。如果匚经熟悉这个模式,则只要看看策略部 分的样本代码,日的是学习如何实现这个模式
实用J2EE设计模式编程指南 应当选择对应川程序有意义的参与者名称。模式类别中的名称通常太抽象,不能直 接使用。选择适当的名称可以简化进一步开发工作,使设计(和代码)更容易理解 ·卜…步是定义接[、组件、类和关系。特别地,设计中与其他类的关系非常重要。 从关系中可以看到模式影响的其他类。通常,我们要将这些类稍作修改,最后避免 类之间的任何耦合。 ·还应选择模式中的适当操作名。这时模式类别中的名称通常也太抽象,还要注意遵 循命名规则 ·最后,要实现模式。这里可以参考采用模式部分,其中列出了正确实现每个模式的 具体例子 图12显示了上述步骤 完全了解设计模式 再次检查是否选择了适当的模式 (检查采用模式部分认真分析例 选择对应用程序有意义的参与者名称 义接凵,组件、类和关系 适当操作名 实现模式 图12 注意模式在设计中引入了一定的灵活性,通过增加了另个抽象层,可能使设计更复 杂,影响性能。因此,一·定要知道为何使刖模式,能够确定实际需要,还嬰与虑是∮需糢 式提供的灵活性。不能为使用模式而使用模式,还要考虑(和∫解)每个模式的后果
第1章J2EE设计模式 卜节介绍何时不适合使用模式,以及因秦改变的问题。 因素改变 前面曾介绍过,设计模式对常见设计问题提供了有用的解决方案。但是,仅靠学习诈 多设计模式并不能成为好的设计人员。我们要了解模式和评估何时使用这些设计模式,采用 某个设计模式有什么好处 我们还要注意,使用太多模式和使用方式不对可能造成过量工程。过量工程就是使体 系结构变得太复杂。过量工程的主要原因是想生成灵活的体系结构,适应将来所有可能的改 变。但关键是不要让代码成为过量工程,否则会浪费时间和内存 另一方面,还要注意不足量工程。不足量工程就是只考虑尽快在系统中增加功能,而 不改进设计,从而引入定时炸弹。使用这种方法时,第一版能很快开发完成,但后面迟早会 遇到麻烦。 在这两种情形中,都可以使用因素改变。 因素改变是一种“行为保留变换“。 Martin Fowler指出,它是“对软件内部结构的改 变,便于理解和修改,不需要改变其外部行为“。 如果连续采用因素改变,则可以一方面改进应用程序设计,一方面防止过量工程和不 足量工程。因素改变时,通常可以利用模式。实践经验表明,我们通常在因素改变时标识模 式,称为模式的因素改变,对应于 Martin Fowler的说法是:“模式是目标,而因素改变是 到达这个目标的途径。”关于因素改变的详细信息见《 Refactoring;: Improving the Design of Existing Code》一书, Addison- Wesley出版(ISBN0-201-48567-2) 前面介绍了模式文档记录经过证明的良好设计方法,但也有一些不好的设计方法。记 录不好的设计方法有助于避免使用这些方法,这就是反模式。下节介绍反模式 反模式 设计模式文档记录经过证明的良好设计方法,其中的模式能够达到目标。也有一些不 好的设计方法,不能够达到目标。人们很少提到这些应用程序的设计与体系结构。这些应用 程序的建筑师错在哪里呢?记录这些错误决策有助于防止在自己的应用程序中犯同样的错误 例如,第一个J2EE应用程序中常见的错误决策是用细粒接口建模实体Bean和直接访问 这样就会增加大量远程方法调用和事务管理开销,使应用程序的性能与伸缩性很差 这类错误记录在反模式中。反模式描述不良方案,不良方案会造成不理想和无法预见 的不利结果。了解不良方案及其不利结果有助于今后避免重走老路。反模式可以避免使用不 良方案和恢复与纠正这些错误,因为反模式提供了成功开发的因素改变方案。 因此,可以把反模式看成与模式相对。模式标识叮行的方案,而反模式标识不可行的 方案或用到错误情境中的方案。尽快标识错误是减少风险的关键,因此,反模式对毎个设讣 人员、建筑师和开发人员都很重要
实用J2EE设计模式编程指南 反模式可以在软作开发的各个阶段标识,因此可以像模式样进行分类。橡模式样 我们要标识反模式,然后通过因素改变改进设计。本书不介绍反模式,但卜列章节会举些 错误决策例子,将其归类为反模式。关于反模式的详细信息,见下列著作: AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis)John wley&Sons出}版(ISBN:0-471-19713-0) 《 AntiPatterns In Project Management》 John Wiley&Sons出版(ISBN:0-471 363669 Java AntiPatterns》 John wiley&Sons出版(ISBN0-471-14615-3) 熟悉设计模式的一般知识和因素改变j反模式之后,下面介绍Java2 Platform Enterprise Edition(J2EE)中的设计模式 J2EE与设计模式 J2EE提供了大量开发企业应用程序的技术。J2EE√1.3支持下列技术: Enterprise JavaBeans(EJB) version2.0提供EJB层开发、部署与管理业务逻辑层组 件的服务。 · JavaServer Pages(JSP) version1.2可以开发动态Web用户界面。 Java Servlets version23提供扩展Web服务器访问业务系统功能的机制。 · JDBC API version3提供与关系型数据库兼容的服务。 Java Message Service(JMS) version1.0.2是访问面向消息中间件(MoM,Mess age- Oriented Middleware)的标准化AP,支持点对点模型与发表/预订模型 Java Remote Method Invocation, RMI-DOP EJava 2 SDK version 1.3. Standard Edition的一部分,提供ORB服务,支持分布式对象与组件之间的透明远程方法调用 ORB是与协议独立的,目前支持RM目然协议(JRMP)和 CORBA兼容IOP协议。 Java Interface Definition Language(IDL), Java 2 SDK version 1.3, Standard Edition的一部分,是 CORBA兼容ORB,实现使用OP协议的外部 CORBA分布式对象 之间的相互操作性。 Java Transaction API (JTA)version 1.0.15Java Transaction Service (JTS version1.1支持事务并提供应用程序层事务分界的接口 · Java Authentication and Authorization Service(JAAS) version10提供安全性服务 特别是验证与授权,提供验证用户的可插入验证模块(PAM, Pluggable Authentication Module)框架实现 Java Naming and Directory Interface(JNDI) version 1.2EJava 2 SDK version 1.3 Standard Edition的一部分,是访问名称与目录服务的标准化AP Java API for XML Parsing(JAXP) version1.1支持处理XML格式数据,提供文档 对象模型(DOM, Document Object Model)、XML的简单API(SAX, Simple API for XML)和XML样式表单转换语言(XSLT, XML Style Sheet Language for Transformations)转换引擎