UML软件工程组织

 

 

如何使用 IBM Rational Software Architect 创建复合模式
 
作者: Yi-Hsiu Wei ,Janette Wong ,Scott Schneider 出处:IBM
 
本文内容包括:
您可以从已有模式中创建复合模式以简化重复性使用多重模式的问题。本文证明了如何使用已有的 Rational Software Architect 模式来创建可重复使用的高级复合模式。它将针对特定问题的软件开发抽象水平提升到了一个新的高度,提高了生产力并且改善了软件质量。

您可以从本文中学到什么

模式往往具有相关性,因此可被用来创建更大的架构与设计方案。例如,假设您要解决一个使用多重模式的问题,且需要重复求解相同的问题,那么每次都会使用同一模式集合。最有效的解决方案也许就是创建一个包含组件模式集合的复合模式。

本文扩展了 developerWorks 系列文章, "Build J2EE applications with IBM Rational Software Architect Enterprise Patterns" 的第8部分(请浏览 参考资源), 会为您展示如何创建一个复合模式。这种可重复使用的复合模式允许通过 IBM® Rational®Software Architect 工具迅速的构建起 Java™ 2 Platform、 Enterprise Edition (J2EE™) 程序。 您会学习到如何在您通常使用的配置中融合两种企业模式以创建复合模式。然后您就可以在业务信息模型中使用单独的复合模式,并且产生模型的 J2EE 工件和业务逻辑的占位符,就像分别使用两种企业模式一样。

复合模式

虽然电子商务模式以文档化形式捕获了解决方案开发的经验和知识,例如模式说明,而 IBM Rational Software Architect 元工具为您提供了编制可重用软件工件的能力,这些可重用软件工件被称之为基于模式的宏模式实现的可重复软件工件中为模式编码。本文中的模式表示可编码的、可重复使用的、基于模式的宏。

随着越来越多的模式可被重复使用,在开发包含多重低层的模式解决方案时进行模式结合就变得越来越普遍化。然后当您需要快速解决问题时,您可以使用这些 "模式处方" 文档化和指导所选模式和其他工件的结合使用。除此之外,复合模式以代码形式获得了使用多重模式开发方案的通常用法和实践。复合模式将软件开发的抽象层次提升到了适应特定问题领域的水平。

模式兼容性

虽然模式可以根据目的及输入输出参数的交互组合在一起,但组件模式的语义兼容性并不容易进行机械性的分析。除输入参数和多样性外,主要是因为并不充足的模式语义规范造成的。例如, 所使用的概要文件,限定为某种模式参数的元素期望类型,在模式描述过程中所期望的模式转换输出仅能被非正式的记载。

尽管有这些限制,模式的复合还是与如何共同使用多重服务以创造高级别服务或解决方案非常类似。模式复合的目标就是捕获协同工作的模式的使用。当将模式进行组合以自动化已证明的通用实践过程中很少存在交叉模式语义问题。

根据两种企业模式创建复合模式的例子

当针对特定领域问题开发多重解决方案或方案更新时,如果认为模式组合会重复使用,那么创建一个复合模式就具有它的价值。复合模式捕获了应用组件模式和辅助工件的使用模式。

本实例来自 Session Facade 和 Business Delegate 企业模式的应用(参见 图 1)。 Session Facade 模式产生一个 session bean 类作为针对业务信息建模的 bean 类实体前端。session bean 类提供了业务信息服务。Business Delegate 模式从 session bean 类产生一个简单的 Java™ 类。您可以为业务客户的 Java 类增加业务逻辑,从而获取业务信息。Business Delegate 还会隐藏来自客户的业务服务特性,诸如远程技术选择。
图 1. 企业模式的关系
Figure 1. Diagram of enterprise pattern relationships
 

图 2所示的 Session Facade 和 Business Delegate 模式实例包括大量个性化的模式参数。


图 2. Session Facade 和 Business Delegate 模式
Figure 2. Diagram of Session Facade and Business Delegate patterns

如果您应用 Session Facade 模式Business Delegate 模式开发解决方案,这种称为 Business Delegate Facade 的复合模式将会十分有效。

我们发现模式,而不是发明模式。相同的原则也适用于复合模式。因此,在试图构成模式前,您需要检查现存模式的用途,调查是否某些模式常常被共同使用,他们的参数是如何交互的,需要配置哪些参数,哪些参数经常使用相同的固定值。

本例依据于使用经验,因此我们知道这两种企业模式如何共同工作、它们的参数是如何交互的。我们分析它们的参数依赖,并在 Rational Software Architect 模式框架中应用模式激活复合模式,这种复合模式执行原来分别独立的两个组件模式的操作。

按照以下步骤创建称为 Business Delegate Facade 的复合模式:

  1. 分析组件模式的输入和输出。
  2. 决定复合模式的参数。
  3. 分析参数依赖。
  4. 确定参数和依赖委托。
图 3 说明了时序及每步的概要说明。
图 3. 设计复合模式过程的步骤
Figure 3. Steps in designing a composed pattern

您还可以决定给参数赋默认值或使其不可见,这些都依据过去使用组件模式的经验,并简化了用户体验。

1. 输入输出分析

图 4 描述了输入/输出关系及两组件模式的参数依赖。Session Facade 模式实例的Session Facade 参数指定了模式输出(或 session bean 类), 它是在手动将 entity bean 类绑定到Entity Bean输入参数时被创建得。创建它后,session bean 类被手动绑定到 Business Delegate 模式实例的 Business Service 输入参数。它创建了一个简单的 Java 类,类名出现在 Business Delegate 模式实例的Business Delegate 输出参数中。
图 4. 参数分析
Figure 4. Parameter analysis diagram

2. 复合模式参数

因为 Session Facade 的Session Facade 输出参数被传递到 Business Delegate 模式的Business Service 输入参数中,所以称为 Business Delegate Facade 的复合模式(Session Bean Class)的参数将这两种组件模式参数结合在一起。这一参数通过 Rational Software Architect 模式参数和依赖委托实现了两个组件模式间的数据连接。

这一新模式包括了一个由 Business Delegate 模式产生的、被称作 Business Delegate Class 的简单 Java 类的参数。这一新模式还包括另外两种输入参数:

  • Entity Classes 参数, 与 Session Facade 模式的Entity Bean 参数对应
  • Remote Interface 参数, 与 Business Facade 模式的Use Remote EJB Interfaces 参数对应

每个参数与组件模式中的相应参数都具有相同的类型。(参看 图 5。)

  • Business Delegate Class: 提供业务服务的简单 Java 类
  • Session Bean Class: 提供业务数据服务
  • Entity Classes: 被业务服务管理使用的数据模型
  • Remote Interface: 显示是否支持远程接口

图 5. 新模式参数
Figure 5. Illustration of new pattern parameters

 

3. 参数依赖分析

正如图 4的虚线箭头所示, Session Facade 参数依赖于Entity Bean 参数,Business Delegate 参数依赖 Business Service 参数和Use Remote EJB Interfaces 参数。

复合模式必须具有相同参数依赖关系。图 5中,Session Bean Class 参数依赖于 Entity Classes 参数, Business Delegate Class 参数依赖于 Remote Interface 参数。所以,复合模式中的Session Bean Class 参数表示两种组件模式中的 Business Service参数和Session Facade参数,因为它们有以下的依赖关系:

Business Delegate > Business Service > Session Facade parameter > Entity Bean.

因此图 4中,Business Delegate Class 参数依赖于 Session Bean Class 参数。 Business Delegate Class 参数还间接依赖于Entity Classes 参数。

4. 委托分析

复合模式中的参数以两种方式委托给组件模式操作:

  • 依赖委托: 复合模式参数间(例如, Business Delegate ClassSession Bean Class间, Session Bean ClassEntity Classes间, Business Delegate ClassRemote Interface间) 的依赖被委托给组件模式中的相应依赖。 Business Delegate ClassEntity Classes 参数间额外的依赖可被增加到复合模式中,当Entity Classes参数改变时可用以获得Business Delegate Class的提示更新。
  • 参数委托: 复合模式参数(Business Delegate Class, Session Bean Class, Entity ClassesRemote Interface)的expand操作被委托给组件模式中的相应参数。由于 Session Bean Class 参数表示 Session Facade 参数和 Business Service 参数,它的 expand 操作需要同时委托给组件模式参数。

复合模式实现

在获得分析结果后,您可以按照如下步骤编制复合模式了:

  1. 在 Rational Software Architect pattern plug-in 项目中创建 Business Delegate Facade 模式,我们将使用模式模版添加四个参数、并创建来自于设计分析的参数依赖。(参看 图 6

图 6. 复合模式实例
Figure 6. Composed pattern instance
 
  1. 在生成的模式代码中,模式文件夹中的 BusinessDelegateFacade.java 文件的顶部,为参数和依赖委托增加两条import 命令(参看 列表 1代码)。

列表 1. 为参数和依赖委托的Import命令
 
                 
import com.ibm.xtools.patterns.framework.PatternDependencyDelegate; 
import com.ibm.xtools.patterns.framework.PatternParameterDelegate;

 
  1. 在同一 Java 文件中的 BusinessDelegateFacade 类内,增加两个 PatternDefinitionUsage 声明(参看 列表 2)以创建针对两个组件模式的模式使用参考。

列表 2. PatternDefinitionUsage 声明
 
                 
public class BusinessDelegateFacade extends AbstractPatternDefinition {
	private final PatternDefinitionUsage businessDelegatePattern  =
		new PatternDefinitionUsage( new PatternIdentity(
			"com.ibm.xtools.patterns.content.j2ee.businessdelegate", "1.0.0",
			"com.ibm.xtools.patterns.content.j2ee.businessdelegate.patterns.
			businessdelegate.BusinessDelegatePattern", "1.0.0"));

	private final PatternDefinitionUsage sessionFacadePattern  =
		new PatternDefinitionUsage( new PatternIdentity(
			"com.ibm.xtools.patterns.content.j2ee.sessionfacade", "1.0.0",
			"com.ibm.xtools.patterns.content.j2ee.sessionfacade.patterns.
			sessionfacade.SessionFacadePattern", "1.0.0")); 

 
  1. 对于每个依赖于其他参数的参数而言,要为参数内部依赖类的构造函数增加 PatternDependencyDelegate 声明(参看列表 3)。 在这种情况下:
    • Session Bean Class具有 Entity Classes的依赖关系。将这种依赖操作委托给 Session Facade 模式的相应参数依赖操作。
    • Business Delegate Class 具有Session Bean Class的依赖关系。 与上面类似,将这种依赖操作委托给 Business Delegate 模式。
    • Business Delegate Class也具有 Remote Interface的依赖关系。将这种依赖操作委托给 Business Delegate 模式。

列表 3. PatternDependencyDelegate 声明
 
                 
private SessionBeanClass_EntityClassesDependency( AbstractPatternParameter 
 dependency) {
 super(SessionBeanClass.this, dependency);
 new PatternDependencyDelegate(this, BusinessDelegateFacade.this.sessionFacadePattern,
  new PatternParameterMapping.Provider() {
    public void provide(
     final PatternParameterMapping.Map map) {
      map.map(BusinessDelegateFacade.this.sessionBeanClass, "Session Facade");
      map.map(BusinessDelegateFacade.this.entityClasses, "Entity Bean");
  }
 });
}

private BusinessDelegateClass_SessionBeanClassDependency(AbstractPatternParameter 
 dependency){
 super(BusinessDelegateClass.this, dependency);
 new PatternDependencyDelegate(this,BusinessDelegateFacade.this.businessDelegatePattern,
  new PatternParameterMapping.Provider() {
    public void provide(
     final PatternParameterMapping.Map map) {								       
       map.map(BusinessDelegateFacade.this.businessDelegateClass,"Business Delegate");
       map.map(BusinessDelegateFacade.this.sessionBeanClass, "Business Service");
   }
 });
}

private BusinessDelegateClass_RemoteInterfaceDependency(AbstractPatternParameter 
 dependency) {
 super(BusinessDelegateClass.this, dependency);
 new PatternDependencyDelegate(this,BusinessDelegateFacade.this.businessDelegatePattern,
  new PatternParameterMapping.Provider() {
   public void provide(
    final PatternParameterMapping.Map map) {
      map.map(BusinessDelegateFacade.this.businessDelegateClass, "Business Delegate");
      map.map(BusinessDelegateFacade.this.remoteInterface, "Use EJB Remote Interfaces"); 
  }
 });
}

 
  1. 为复合模式的每个参数类的构造函数增加PatternParameterDelegate 声明已成为一种普遍规律。 (参看 列表 4。)这样就将它的扩展操作委托给组件模式中相应的参数操作了。确保组件参数的所有expand 操作都可被复合模式适当的激活。也就是:
    • Entity Classes 参数委托给 Session Facade 模式的Entity Bean 参数。
    • Remote Interface 参数委托给 Business Delegate 模式的Use Remote EJB Interfaces 参数。
    • Session Bean Class 参数委托给 Session Facade 模式的 Session Facade 参数和 Business Delegate 模式的Business Service 参数。
    • Business Delegate Class 参数委托给 Business Delegate 模式的 Business Delegate 参数。

列表 4. PatternParameterDelegate 声明
 
                 
EntityClasses() {
 super(BusinessDelegateFacade.this, new PatternParameterIdentity(PARAMETER_ID));
 new PatternParameterDelegate(this,BusinessDelegateFacade.this.sessionFacadePattern,
  new PatternParameterMapping.Provider() {
   public void provide(final PatternParameterMapping.Map map) {
    map.map(BusinessDelegateFacade.this.entityClasses, "Entity Bean");
   }
 });
}

RemoteInterface() {
 super(BusinessDelegateFacade.this, new PatternParameterIdentity(PARAMETER_ID));
 new PatternParameterDelegate(this, BusinessDelegateFacade.this.businessDelegatePattern,
  new PatternParameterMapping.Provider() {
   public void provide(final PatternParameterMapping.Map map) {
    map.map(BusinessDelegateFacade.this.remoteInterface, "Use Remote EJB Interfaces");
   }
  });
}

SessionBeanClass(EntityClasses entityClasses) {
 super(BusinessDelegateFacade.this, new PatternParameterIdentity(PARAMETER_ID));
 new SessionBeanClass_EntityClassesDependency(entityClasses);
 new PatternParameterDelegate(this, BusinessDelegateFacade.this.sessionFacadePattern,
  new PatternParameterMapping.Provider() {
   public void provide(final PatternParameterMapping.Map map) {
    map.map(BusinessDelegateFacade.this.sessionBeanClass, "Session Facade");
   }
  });
 new PatternParameterDelegate(this, BusinessDelegateFacade.this.businessDelegatePattern,
  new PatternParameterMapping.Provider() {
   public void provide(final PatternParameterMapping.Map map) {
    map.map(BusinessDelegateFacade.this.sessionBeanClass, "Business Service");
   }
  });
}

BusinessDelegateClass(SessionBeanClass sessionBeanClass,RemoteInterface remoteInterface) {
 super(BusinessDelegateFacade.this, new PatternParameterIdentity(PARAMETER_ID));
 new BusinessDelegateClass_SessionBeanClassDependency(sessionBeanClass);
 new BusinessDelegateClass_RemoteInterfaceDependency(remoteInterface);
 new PatternParameterDelegate(this, BusinessDelegateFacade.this.businessDelegatePattern,
  new PatternParameterMapping.Provider() {
   public void provide(final PatternParameterMapping.Map map) {
    map.map(BusinessDelegateFacade.this.businessDelegateClass, "Business Delegate");
   }
  });
}

使用新的复合模式

您可以为客户数据模型应用复合模式,就如同 Session Facade 模式一样(参看 图 7)。请按照如下步骤:

  1. 创建一个 Customer 实体类。
  2. Session Bean Class指定CustomerSB的类名,并生成 session bean 类模型。
  3. Customer类拖至Entity Classes参数用以更新 session bean 类。
  4. Business Delegate Class指定CustomerBD的类名,并生成 Java 类模型。

注意: 所产生的 session bean 类的service 并没有被正确的显示出来。解决这个问题之前,我们首先在第4步前手动增加原型。


图 7. 使用复合模式
Figure 7. Applying your composed pattern (screen capture segments)

清除参数

模式参数提供了多种自定义变量。根据您的使用经验,您可以为参数设置默认值或者使用硬编码的方法将其从复合模式中删除。这些都可以大大简化模式使用过程。

本例中,也许您需要为 Remote Interface 参数设置默认值true以表示支持远程接口,或者相反,在模式源代码中通过设置值将参数清除。 如果所产生的 session bean 类没有被使用或没有与其他模型元素发生关联,也许您就要删除来自模式实例中间载体 Session Bean Class参数的可见性。本系列中的一篇独立文章介绍了这种方法的详细过程及其代码。

您所学到的价值

本文描述了从已存在的模式中创建复合模式的普遍方法,并通过一个详细的例子解释了如何设计与实现。复合模式的要点就是如何使用已有模式并为重复使用它们提供高水准的抽象。因此,它可以简化基于模式的开发过程。

当开始构建基于模式的解决方案时,也许在决定哪种模式需要被组合之前,您要考虑解决方案的粒度问题。为了重用他们,您可以使用本文的步骤创建自己的复合模式和层次。

下载

描述 名字 大小 下载方法
Project Interchange for the composed pattern BusinessDelegateFacade.zip 115KB HTTP

参考资料

学习 获得产品和技术 讨论
 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号