软件的重用一直以来都是软件开发追求的重要目标之一。软件的重用可以缩短软件开放周期,提高软件质量。可重用的软件组件、设计、代码是软件开发企业最重要的资产。但是软件的重用受到很多因素的影响,比如软件设计的质量,项目的交付时间,以及软件开发过程各阶段工作产品的管理及规范都在某种程度上制约了软件的重用。软件的重用可以分为多个层次:代码级重用,组件级重用,设计的重用,软件架构的重用以及解决方案的重用。对于开发人员来说更加关心代码级重用,组件级重用,设计的重用和软件架构的重用。Rational XDE提供了通过支持模型和代码模板来达到软件重用目的的机制,可以实现各个层次的软件重用。本文是将向大家介绍如何在XDE 中创建自己的模式,并利用XDE的代码模板和模式的结合更加促进软件的重用。
在本文的前一篇文章 在XDE中应用模式中我们已经了解了如何在XDE中应用一个创建好的模式。如果你只是应用模式的开发人员,这已经足够了。但如果你是一名模式的设计人员,本文的内容对你来说是非常重要的。作为一个模式的设计人员,你必须对在创建模式过程中的每一个概念有透彻的理解。接下来我们对XDE中有关模式的概念做一个介绍。
Rational XDE中有关模式的概念
在学习使用Rational XDE来创建模式之前我们需要对Rational XDE中涉及到的模式的概念有所了解,这样在学习使用模式的过程中,大家会有更清晰的思路。
Rational XDE对模式的支持
Rational XDE对模式的支持体现在几个方面:模式的创建(定制模式)、模式的应用(使用模式)、对已有模式的支持和RAS模式支持。
- 模式的创建:在Rational XDE中,我们可以创建属于自己的模式,模式中可以包含模式的用UML表示的模式设计模型以及可以参数化的模板参数,还可以包含支持代码生成的代码模板。在Rational XDE 中提供了专门的工具和视图帮助模式的开发人员完成模式的创建工作。在创建模式时,模式开发人员可以为模式添加完善的文档,以指导模式的使用者选择和应用模式,同时Rational XDE 提供了应用模式向导的机制来指导模式用户对模式的使用。模式开发人员可以定制特定模式的使用向导,通过提示对话框一步一步的指导模式的使用。
- 模式的应用: 如果你只是模式的使用者,你可以利用Rational XDE非常方便的应用已有的模式,结合Rational XDE的代码和模型同步的特性可以大大的提高软件开发的效率和提高软件的质量和可靠性。
- 对已有模式的支持:在Rational XDE中包含了对业界最著名的模式的支持,例如四人帮模式、J2EE核心模式等。在RDN(Rational 开发者网络)上,有一个专门为交换模式资产的区域,我们可以从这个区域免费的下载可用的模式。
- RAS(可重用资产规范)支持:在XDE中模式可以按照RAS的标准来组织和归档,RAS是对软件开发过程中可重用资产进行组织的业界标准。模式以RAS标准组织意味着模式可以更好的被软件组织重用。
模式模板(pattern template)
模式模板是XDE中模式的核心部分,几乎所有的模式元素都定义在模式模板当中,其中包括模式的设计模型和参数。我们可以通过Model Explore来浏览和编辑它。模式模板用资产<>原型来表示,如图1所示。从图1中我们可以看到名为RASPackage1的模式模板,其中包含模式的设计模型以及模型中类的定义。
图1: 模式模板
模板参数(template parameter)
模式的设计人员必须为模式模板设置模板参数,哪怕模式模板本身不需要参数,这个模板参数也是必须的。你可以为模板参数设定缺省的值,或者在模式的应用时为模板参数赋值。
根上下文(Root Context)
根上下文是模式的一个属性,用它来指明模式模板的一个模式内容被应用的范围,这个范围可以是模式模板内容体的整体,也可以是模式模板内容体中的一个包或者一个类。通过这个设置我们可以实现相同的模型的不同部分可以被不同的模式使用。
绑定和绑定点(binding and binding location)
绑定是模式中的参数被赋予具体的参数值的过程,这个参数值可以是用户指定的一个模型元素,也可以是用缺省值自动创建的元素。当一个模式被应用之后,在指定的绑定点中就有一个绑定对象被创建,它被用来维护这个模式的模板参数和具体的参数值之间的绑定关系。你可以直接在绑定对象中修改被绑定的参数值。在缺省的情况下,绑定点和扩展点是同一位置。
扩展点(expansion location)
扩展点是在使用模式时,模式实现文件存放的地方。你必须要为模式的应用设置它。
模式与模式资产
模式的基本组件是参数化协作,你可以把一个参数化协作看作为一个模式。模式资产是具有RAS资产结构的模式,它是RAS资产的一种。因此不是所有的模式(参数化协作)都是模式资产,但模式可以被转换成为模式资产。说到这里你可能有点困惑,模式和模式资产到底有什么区别呢?为了解释模式和模式资产的区别,我们首先应该对RAS(可重用资产规范)有所了解。
Reusable Asset Specification (RAS) 提供了一种标准的方法用于打包和释放一系列相关的文件。这些文件或工作产物的集合被称为asset(资产)。RAS资产简化了与其他用户共享过程的解决方案,因为大家使用了方便一致的方法来组织,文档化,共享,存储和恢复软件的资产。RAS资产在尺寸,复杂性和目的上可以是千差万别的。RAS资产的范围是资产的制造者根据客户的需要制定的。我们来看一个RAS资产的例子,一个资产包含一系列的引用文件,这些文件可以包含源程序的代码片断,文档等。资产也可以被设置为网络资源定位。另一个使用RAS资产的例子是创建一些存贮了设计模式和代码模板的资产。这些RAS资产包含通用的代码结构和模型。应用他们可以快速的产生设计和代码。更加复杂的RAS资产能够被设计包含用于创建子系统的软件架构,以适应系统需求变化的需要,这样的一个RAS资产可以作为整个应用的基础。
XDE资产由可以被重用的模型和模型元素组成。资产包括各种类型的引用文件:代码模板、外部代码文件、模式模型、定制的模式图标、电子表格、文字处理文件、脚本和html页面。基本上所有可以被模型引用的文件都可以包含在模式资产当中。模式资产是RAS标准兼容的,它具有以下特征:
- 拥有模式(参数化协作)的模型和包被设置为原型<>
- 为文档化的目的产生一个RAS标准的XML文件
- 为模式分配一个根上下文(Root Context),它可以包含一些非参数化的元素或者嵌套的模式
- 可以使用Apply Pattern Wizard来应用模式
- 可以作为RAS类型文件导入和导出所有相关的文件
现在大家应该明白模式和模式资产的区别了吧,模式和模式资产的核心内容是一样的,都可以被重用。但模式资产具有RAS标准兼容的结构,可以使模式更方便的在开发团队或者组织之间进行交换,可以以标准的格式方便的导入和导出,而且可以在资产库中方便的检索和查询。因此当我们创建模式时,首选的方式是创建模式资产。
创建模式
在我们开始在XDE中创建模式资产之前我们应该对将要创建的模式中的元素和结构有一个清晰的思路。一个模式是一个解决某种问题的方案,但这个方案的具体实现可以是根据不同的需要而不同。你可以只是根据你的开发项目来实现这个模式,或者你希望将这个模式实现成为可以通用的。为了能够更加好的让大家理解如何在XDE中创建模式资产,我们选择通过实现一个四人帮的Proxy模式作为例子。这个模式已经在XDE中缺省的被安装了,我们将按照它的实现来展示创建模式资产的整个过程。
首先我们先来简要的介绍一下Proxy的作用和Proxy模式中包含哪些内容。Proxy模式的作用是在客户和处理程序之间加一个中间层,当客户发出处理请求时,请求先发给Proxy对象,再由Proxy对象将客户请求转发给真正的处理程序,最后由处理程序处理客户的请求。Proxy模式的好处在于客户程序可以拥有对处理程序的稳定接口,也就是说,无论处理程序发生了什么变化,客户程序对处理程序的调用都不需要有任何变化。同时也可以实现通过相同的调用方式对客户的不同请求调用不同的处理程序。客户程序与处理程序是独立分开的,他们通过Proxy对象连接在一起。下面我们来看一下Proxy模式中有哪些元素组成,以及他们之间的关系。在Proxy模式中应该有三个角色:客户、代理(Proxy)和处理程序。
他们之间的调用关系可以用UML的时序图表示,见图2
图2:Proxy模式的时序图
图中aClent代表客户程序,aProxy代表代理对象,theRealSubject代表处理程序。客户程序首先生成一个代理对象aProxy,代理对象创建处理程序对象,然后客户调用代理对象aProxy的request方法,代理对象将调用请求转发给theRealSubject对象的request方法完成真正的处理。我们在对这个模式进行建模或者设计时,应该考虑如何对这些实体对象进行抽象,也就是创建哪些类或者接口来代表这些实体。这是一个分析的过程,这里我们不对这个过程进行详细的讲解。根据XDE中欲安装的Proxy模式的实现可以知道Proxy模式拥有一个接口和两个类,见图3
图3: 模式Prxoy的类图
接口Subject抽象出了客户感兴趣的方法,类Proxy是代理对象的抽象,它负责创建处理对象和转发客户请求到处理对象,这个类实现了Subject接口,类RealSubject抽象了处理对象,它同样实现了接口Subject。类Proxy包含类型为RealSubject的成员,因此类Proxy与类RealSubject的关系是关联关系。而类Proxy和类RealSubject分别与接口Subject之间是实现关系。为了使Proxy模式的实现更加通用,我们需要为这个模式设置参数,参数的目的是在应用这个模式时,通过对参数赋值来生成用户希望得到的具体类、属性和方法的实现。在这个模式中,我们将设定四个参数分别代表接口Subject、类Proxy、类RealSubject以及操作request。在这模式中我们还要建立模式的类图和时序图以描述类之间的静态和动态的关系。在清楚了要为模式资产创建哪些元素和结构之后我们开始创建Proxy模式资产。
我们将按照以下的步骤对创建模式的整个过程进行详细的介绍:
步骤1:创建一个存放模式资产的模型 步骤2:添加新的模式资产到模型 步骤3:定义模板参数 步骤4:定义缺省的模板参数值 步骤5:创建模式的静态和动态图 步骤6:为模式中的方法添加代码模板
- 步骤1:创建一个存放模式资产的模型
创建模式资产实际上也是一个建模的过程,因此我们首先要创建一个建模项目。
1.打开文件菜单,选择新建 > 项目,弹出新建项目对话框,在对话框左浏览框选择Modeling,在右浏览框选择Java Modeling Project,点击下一步。
2.在项目名文本框输入 Proxy Pattern 作为项目名。其他选项接受缺省值。点击完成。见图4,XDE为们创建了Java Code Model模型,我们将在这模型中创建模式的建模。
图4: 为模式Proxy创建的模型
- 步骤2:添加新的模式资产到模型
有几种不同的方法将一个模式资产添加到一个模型中,这里我们使用一种最常用的方法-使用Add Pattern Asset对话框,使用这种方法XDE将为我们添加基本的模式结构到一个模型中,让后我们必须提供关于模式资产库、位置、容器类型和名字等信息。你也需要设置一些为产生RAS XML文档的选项。其他的添加模式的方法可能不会为我们创建作为RAS模式资产的结构。我们可以基于两种方式创建模式资产:基于包和基于模型。我们将对两种方式分别进行介绍。
添加基于包的模式资产
1.从下面的一种开始:
- 在模式浏览器 (Pattern Explorer)中, 鼠标右键点击 Add Pattern Asset
- 在模型浏览器( Model Explorer)中, 鼠标右键点击 你希望添加到的模型或者包,然后点击 Add UML > Pattern Asset.
- 在图形窗口( diagram window), 鼠标右键点击 你希望添加到的模型或者包,然后点击 Add UML > Pattern Asset. Add Pattern Asset 对话框被打开,见图5
图5:添加Proxy模式资产
2.在Pattern Name 文本框中输入模式的名字,这个名字应该可以表达模式的目的和特征,这里我们输入Proxy。要注意的是这个名字在模式所在的模型或者包中必须是唯一的。
3.在 Library Name文本框中输入我们希望的模式库的名字。你可以接受缺省的值,也可以通过点击旁边的按钮来选择已有的模式库。如果我们输入和一个新的名字,XDE会为我们新建一个模式库。这里我们输入My Patterns.
4.在Asset Properties区域, 选择 Use Package for Asset 选项
5.在 Asset Location 文本框中选择一个已存在的包,新建模式资产的结构文件将存放在这里,我们选择Java Code Model
6.在 Asset Name 文本框中输入资产的名字,这个名字也被用来产生模式资产的包名
7.在 Documentation Properties 区, 完成下面的动作:
- 如果你希望为这个模式产生文档, 点击Specification File Name文本框旁边的按钮,选择存放文档的位置。
- 如果你不希望为这个模式产生文档,清除 Add Documentation 检查框.
8.点击 OK. 如果你在图形窗口(diagram window)创建来模式资产,你的模式将出现在模型浏览器中。这时在模式浏览器中并看不到你的模式。你可以通过右键点击模式,选择Select in Pattern Explorer,模式将会出现在模式浏览器中。 现在来看看XDE为我们生成了什么,见图6
图6:Proxy 模式
可以看到在Java Code Model中,有一个原型为<>的包,这个名字是前面我们设定的模式资产的名字。在这个包下有一个名为Proxy的参数协作,它代表了我们的模式。
添加基于模型的模式资产
2.从下面的一种开始:
- 在模式浏览器 (Pattern Explorer)中, 鼠标右键点击 Add Pattern Asset
- 在模型浏览器( Model Explorer)中, 鼠标右键点击 你希望添加到的模型或者包,然后点击 Add UML > Pattern Asset.
- 在图形窗口( diagram window), 鼠标右键点击 你希望添加到的模型或者包,然后点击 Add UML > Pattern Asset.
Add Pattern Asset 对话框被打开,见图7
图7:添加基于模型的模式资产
8.在Pattern Name 文本框中输入模式的名字,这个名字应该可以表达模式的目的和特征,这里我们输入Proxy。要注意的是这个名字在模式所在的模型或者包中必须是唯一的。
9.在 Library Name文本框中输入我们希望的模式库的名字。你可以接受缺省的值,也可以通过点击旁边的按钮来选择已有的模式库。如果我们输入和一个新的名字,XDE会为我们新建一个模式库。这里我们选择前面已经创建的My Patterns.
10.在Asset Properties区域, 选择 Use Model for Asset 选项
11.在 Model Name 文本框中输入资产的名字,这个名字也被用来产生模式资产所在的模型的名字,我们输入Java Code Model
12.在 Documentation Properties 区, 完成下面的动作:
- 如果你希望为这个模式产生文档, 点击Specification File Name文本框旁边的按钮,选择存放文档的位置。
- 如果你不希望为这个模式产生文档,清除 Add Documentation 检查框.
9.点击 OK.
如果你在图形窗口(diagram window)创建来模式资产,你的模式将出现在模型浏览器中。这时在模式浏览器中并看不到你的模式。你可以通过右键点击模式,选择Select in Pattern Explorer,模式将会出现在模式浏览器中。
添加基于模型的模式资产与添加基于包的模式资产的区别在于基于模型的方式会将模式资产添加到某个已存在的或者新建的模型中,而基于包的方式会将模式资产添加到模型中的某个包中。在我们的例子中我们选择基于模型的方式。这样模式的内容会被添加到Java Code Model模型的根目录下,见图6。
- 步骤3:定义模板参数
我们已经为将我们的Proxy模式添加到了模型Java Code Model中,并已经有了Proxy协作,下面我们需要做的是为Proxy模式添加模板参数。模板参数代表了模式中可以被用户赋值的部分。为了在应用模式时,可以给模板参数赋值,我们在创建模式时至少要为模式添加一个模板参数。而每一个被添加的模板参数都需要被分别的设置类型、结构化的元素、一些高级的特性和约束。模板参数的类型有很多种,分别是:类(Class)、操作(operation)、属性(attribute)、包(Package)、子系统(subsystem)、接口(interface)、String、Real、Integer等等。如果你没有为模板参数设置类型而缺省值的话,模板参数的类型为类(Class)。在我们的Proxy模式的例子中,我们将有四个模板参数要设置,他们就是我们在介绍Proxy模式的部分提到的那四个参数:Proxy、Subject、RealSubject还有一个就是request。他们的类型分别是:Proxy(Class)、Subject(Class)、RealSubject(Class)、request(operation)。在我们创建这些模板参数时,我们也要根据模板参数的类型创建参数的结构元素。比如如果你的模板参数的类型是类(Class),那你就需要为这个模板参数创建类的结构-类的属性、类的操作等。如果你对模板参数的类型是操作(operation),你就需要为这个模板参数设置操作的输入参数的名字和类型、返回值的名字和类型,如果有必要的话还可以为操作添加操作的代码。接下来我们来为我们的Proxy模式添加模板参数,并为他们创建参数结构元素。
添加Proxy模板参数
在模型浏览器(Model Explorer)中,选中协作Proxy,右键点击,在弹出菜单中选择Add UML > Template Parameter,见图8
图8:添加模板数参
命名这个模板参数为Proxy。接下来为模板参数Proxy设置类型,鼠标右键点击模板参数Proxy,在弹出菜单中选择Add UML > Type > Class 见图9
图9:设置模板参数类型
将这个类命名为Proxy。注意,这个名字Proxy实际上就是模板参数Proxy。接下来我们要为类Proxy添加必要的操作。我们将要为Proxy模式添加四个操作:一个缺省的构作函数,一个带一个参数的构造函数,一个名为request的操作和一个名为set<%=RealSubject%>操作。具体步骤如下:
鼠标右键点击模板参数Proxy下的类Proxy,在弹出菜单中选择Add UML > Operation,见图10,
图10:为模板参数添加元素
将操作命名为<%=Prxoy%>,这里我们可以注意一下操作的名字,这是通过一种嵌入式的脚本在各元素中应用模板参数作为变量,对元素进行构造。<%=Prxoy%>是应用模板参数Prxoy作为类Proxy构造函数的名字。你可能发现,类的名字Proxy为什么不用<%=%>呢?这是因为模板参数Proxy的类型就是Class,因此将模板参数用作定义Proxy 类的名字时,只需对这个模板参数的名字进行直接应用就可以了,而不需要<%=%>,但如果模板参数被用来定义其他类型元素的某一部分的话,就需要通过<%=%>来修饰。现在我们已经为类Proxy添加了一个缺省的构造函数。接下来创建带参数的构造函数。重复上面创建缺省构造函数的步骤,选中第二个构造函数<%=Prxoy%>,右键点击,在弹出菜单中选择 Add UML < Parameter,命名参数为subject。然后为这个参数subject设置属性。在subject的属性窗口,设置Kind属性为0-IN,这表示参数subject为输入参数,设置属性TypeExpression为<%=RealSubject%>,这里又用到了嵌入式的脚本,这里应用的是我们要添加的另一个模板参数RealSubject,它的类型是类,而这里我们用它来定义参数的类型,因此需要用<%=%>来引用模板参数RealSubject。见图11
图11:设置参数属性板
接下来我们来添加操作request:
鼠标右键点击模板参数Proxy下的类Proxy,在弹出菜单中选择Add UML > Operation,将操作命名为request,由于request是我们要创建的另一个模板参数,它的类型就是操作,因此在被用于定义操作的名字时可以直接引用。
接下来我们来添加操作set<%=RealSubject%>:
鼠标右键点击模板参数Proxy下的类Proxy,在弹出菜单中选择Add UML > Operation,将操作命名为set<%=RealSubject%>,由于RealSubject是我们要创建的另一个模板参数,它的类型是类,因此在被用于定义操作的名字时应该通过<%=%>引用。我们要为这个操作添加一个输入参数和一个返回值。选中操作set<%=RealSubject%>,右键点击,在弹出菜单中选择 Add UML < Parameter,命名参数为realSubject。然后为这个参数realSubject设置属性。在realSubject的属性窗口,设置Kind属性为0-IN,这表示参数realSubject为输入参数,设置属性TypeExpression为<%=RealSubject%>,这里又用到了嵌入式的脚本,这里应用的是我们要添加的另一个模板参数RealSubject,它的类型是类,而这里我们用它来定义参数的类型,因此需要用<%=%>来引用模板参数RealSubject。接着选中操作set<%=RealSubject%>,右键点击,在弹出菜单中选择 Add UML < Parameter,命名参数为Parameter1。然后为这个参数Parameter1设置属性。在Parameter1的属性窗口,设置Kind属性为3-RETURN,这表示参数Parameter1为返回参数,设置属性TypeExpression为void ,代表返回值类型为void。到此为止我们为模式Proxy添加了一个模式的模板参数Proxy并为它设置了类型和构建了类的内容。见图12:
图12:模式Proxy的模式模板Proxy
按照相同的方法添加其他三个模板模式参数:RealSubject,Subject和request。见图13
图13:Proxy模式的模式模板参数
在图13中我们可以看到我们已经为模式Proxy添加了四个模板参数,而且为他们创建了各自的组成元素。这样模式Proxy的各个参与者都已经被创建了。下面我们要为这四个模板参数定义缺省值。
- 步骤4:定义缺省的模板参数值
我们可以为每一个模式模板参数设置缺省值,虽然这并不是创建模式的必要步骤,但它对于希望更加简单的使用模式的用户是非常有用的,通过使用模板参数的缺省值,模式用户可以通过简单的步骤应用模式。虽然我们为模板参数设置了缺省值,但用户在应用模式时也可以不去使用缺省值,而是自己选择模板参数的值。当然模式的设计者在设计模式时可以将模板参数的缺省值设置成为用户不可修改的,这样在用户应用模式时,用户将无法为这个模板参数赋值,而只能接受缺省值。模式用户可以通过Apply Pattern对话框来为模式的模板参数赋值。在为模板参数设置缺省值之前,我们首先要设置模板参数的值来源(Value Sources)属性,这个属性的决定了模板参数的值是来自于哪里。通常我们可以设置这个属性为User 、 Generated、Collection和他们的组合。User选项代表模板参数值是来自于用户模型中已存在的元素;Generated代表模板参数的值是新成生的;Collection代表模板参数的值来源于一个定义好的集合,这个集合是集合拥有者元素和元素或者UML关系的合并,集合拥有者可以是一个特定的模型元素,或者被指向其他的模板参数。集合的可变性为我们提供了一个选择目标元素的高度灵活的方法。下面我们来为模板参数设置缺省值。
设置值来源(Value Sources)属性:
在模式浏览器中,找到模式Proxy的Proxy模板参数,展开它,然后展开高级特性(Advanced Properties)节点,你将看到值来源(Value Sources)属性节点,选中值来源(Value Sources)属性节点,你将在模式特性窗口看到值来源(Value Sources)属性的设置选项,见图14
图14:设置模板参数值来源属性
在模式Proxy的模板参数Proxy的值来源属性窗口中我们看到有三个选型:User specified model elements、Generated model elements 和 Collection of model elements。我们希望Proxy模板参数的值可以是来自于模型中已存在的元素,也可以是模型中不存在的,根据模板参数的值新创建的元素。因此我们将前两项选中。我们可以通过应用模式来测试一下我们的选项设定。在模式浏览器中选中Proxy模式,右键点击,在弹出菜单中选择Apply This Pattern,应用模式选择对话框出现,选择Apply Pattern Dialog,应用模式对话框出现见图15
图15:应用Proxy模式
在Parameter Information 部分我们看到了之前我们添加的是个模板参数。鼠标双击模板参数Proxy的Values域,弹出Select Argument Values对话框,见图16
图16:选择模板参数值对话框
在Available value sources部分我们可以看到两个选项:User和Generated。这两个选项正是我们在模板参数Proxy的值来源属性中设置的。
下面我们来为Proxy模板参数设置缺省值:
在模型浏览器中,选中Proxy模式的Proxy模板参数,右键点击,在弹出菜单中选择Add UML < default value,缺省参数图标出现在模板参数Proxy之下,见图17
图17:添加模板参数缺省值
图中我们可以在模型浏览器和模式浏览器中看到Proxy模板参数的缺省值。
现在我们来为模板参数缺省值设置具体的值:
在模式浏览器中选中模式Proxy的模板参数Proxy的缺省值,右键点击选择Edit Argument Values菜单项,出现Select Argument Vaules对话框,这个对话框和在应用模式时为模式模板参数赋值的对话框是一样的。
在Select Argument Vaules对话框的Available value sources部分选择Generated选项,在Specify values for Proxy Parameter 部分选择Simple value选项,在文本框中输入Proxy作为Proxy模板参数的缺省值,因为模板参数Proxy的类型为Class,所以缺省值Proxy代表的是类的名字。点击Select>>按钮,在Selected Class框中出现了Proxy,点击OK按钮完成缺省值的设置。见图18
图18:为Proxy模板参数设置缺省值
按照上面的步骤完成其他两个模板参数(Subject和RealSubject)的缺省值的设置,另一个模板参数request不需要设置缺省值。在设置完缺省值后,让我们来看一看设置缺省值的效果。在模式浏览器或者模式浏览器中选中Proxy模式,右键点击,在弹出菜单中选择Apply This Pattern菜单项,在应用模式对话框中可以看到,三个模板参数的缺省值,见图19
图19:查看模式模板参数缺省值
- 步骤5:创建模式的静态和动态图
现在我们已经创建了模式Proxy的四个模板参数,并未三个模板参数设置了缺省值,但我们还缺少模式中的静态结构和动态交互的描述。下面我们将为模式Proxy添加静态的类图和动态交互的时序图。
构建Proxy模式的静态描述
在Proxy模式中,我们已经拥有为一个接口和两个类,因此我们需要通过UML的类图来描述他们之间的静态关系。由于我们在模式Proxy的参数协作中创建了代表类和接口的模板参数,因此我们将Proxy模式的类图创建在参数协作中。创建模式的类图和在模型中创建类图没什么不同,只不过我们使用的类和接口可能是模板参数。具体步骤如下:
在模型浏览器中,找到模式Proxy的参数协作,右键点击,在弹出菜单中选择Add Diagram > Class,用Proxy Participants命名这个类图,从名字上就可以看出,这个类图描述了Proxy模式中有哪些参与的类以及他们之间的关系。现在我们将接口Subject、类Proxy和RealSubject拖到类图中,添加Proxy类对Subject类的实现(realize)关系和RealSubject类对Subject类的实现(realize)关系,并添加Proxy类对RealSubject类的关联关联关系。类图见图20
图20:模式Proxy的类图
这个类图在模式应用时被创建到用户选定的模型或者包中,这时四个模板参数已经被用户赋值。
创建Proxy模式的动态描述
在模式Proxy中我们将创建一个描述各参与对象实例之间交互的时序图。时序图中存在着代表类实例的对象,因此我们需要创建一个协作实例(Collaboration Instance),在协作实例中我们可以创建类对象。在协作实例中还需要创建一个交互实例(Interaction Instance),在交互实例中包含类对象之间的交互关系和时序图。
在模型浏览器中右键点击模式资产Proxy,在弹出菜单中选择Add UML > Collaboration Instance,命名为Perform Request,见图21。
图21:添加协作实例(Collaboration Instance)
然后右键点击协作实例Perform Request,在弹出菜单中选择Add UML > Interaction Instance,创建名为Perform Request的交互实例。右键点击交互实例Perform Request,在弹出菜单中选择 Add Diagram > Sequence Instance,见图22,命名为Perform Request。
图22:为模式添加时序图
如图23,完成时序图Perform Request。
图23:模式Proxy的时序图
- 步骤6:为模式中的方法添加代码模板
现在我们已经有了模式的模板参数,并为模板参数设置了值来源和缺省值,也有了模式的静态和动态的描述。从理论上讲,我们已经创建了一个完整的模式资产,你可以应用这个模式来成生程序的模型和框架代码。在XDE中提供了一个叫作代码模板(Code Template)的功能,可以非常好的实现代码片断的重用。将代码模板和模式设计相结合,可以产生对开发人员更加有用的模式。通过对模式中的方法进行代码模板的绑定,可以在应用模式时自动的为开发人员生成代码模板中的代码片断。接下来我们将为我们的Proxy模式中的方法创建和绑定必要的代码模板。步骤如下:
在模型浏览器中,找到模板参数Proxy,鼠标右键点击模板参数的<%=Proxy%>操作,在弹出菜单中选择Code Template > Bind,弹出绑定代码模板对话框,见图24
图24:绑定代码模板
点击对话框上方的New按钮,弹出新建代码模板对话框,见图25
图25: 创建代码模板
在Name文本框输入代码模板的名字,我们输入constructor,在Description文本框中输入代码模板的描述。按下一步。进入创建代码模板的第二步。见图26
图26:添加代码模板的参数和模板主体
在参数栏点击Add按钮,添加一个参数theRealSubject,类型为String,缺省值为空。这个参数是代码模板的参数,参数的值可以在每次绑定时设置,在我们对模式参数Proxy类的构造函数绑定时,我们赋值为the<%=RealSubject%>,这个值用到了模式的模板参数RealSubject,请大家注意一定要区分开代码模板的参数和模式模板的参数。在User Data文本框输入the<%=RealSubject%>,在Body Kind中选择Scripted Template,在Scripting Language中选择JavaScript,在Body文本框中输入下面的代码:
\nthis.<%=theRealSubject%> = subject; \n\n
注意这段代码中包含一些\n,这是在代码生成时进行换行,如果你在应用模式时对模式模板参数RealSubject赋值为AAA,这个代码模板生成的代码片断为:
this.theAAA = subject;
点击完成,实现了对模式Proxy中的Proxy模板参数的构造函数的代码模板的绑定。你可以通过相同的方法对其他操作进行代码模板的绑定。
到现在为止我们已经完成了创Proxy建模式资产的所有步骤,现在我们可以应用我们创建的Proxy模式来生成程序的设计和框架代码了。应用模式的过程请参考《利用Rational XDE中模式能力来促进软件的重用-在XDE中应用模式》。
本文对在XDE中创建模式资产的基本步骤作了详细的讲解,如果你希望了解在XDE中创建模式资产的更详细的信息,请参XDE 的帮助系统中的Rational XDE 资源部分。
参考资源
Rational XDE介绍 http://www.ibm.com/developerWorks/cn/java/l-xde/
利用Rational XDE中模式的能力来促进软件的重用-在XDE中应用模式 http://www.ibm.com/developerWorks/cn/java/l-xde-pattern1/
Rational 开发者网络http://www.rational.net/
developerWorks Rational产品园地 http://www.ibm.com/developerworks/rational
developerWorks中国网站 Java 专区 http://www.ibm.com/developerworks/cn/java
|