2004 年 1 月
软件的重用一直以来都是软件开发追求的重要目标之一。软件的重用可以缩短软件开放周期,提高软件质量。可重用的软件组件、设计、代码是软件开发企业最重要的资产。但是软件的重用受到很多因素的影响,比如软件设计的质量,项目的交付时间,以及软件开发过程各阶段工作产品的管理及规范都在某种程度上制约了软件的重用。软件的重用可以分为多个层次:代码级重用,组件级重用,设计的重用,软件架构的重用以及解决方案的重用。对于开发人员来说更加关心代码级重用,组件级重用,设计的重用和软件架构的重用。Rational XDE提供了通过支持模型和代码模板来达到软件重用目的的机制,可以实现各个层次的软件重用。本文是将向大家介绍如何在XDE 中应用已经创建好的模式来促进软件的重用。
Rational XDE 模式基础
使用模式的好处
模式是在某一特定环境下,对一个特定问题的一个解决方案。使用模式可以给我们带来短期或长期的利益。但是在使用模式的过程中一定要注意,并不是在你的软件开发中使用了模式,就表示你的软件设计就是合理的。在你决定选择哪一种模式的时候一定要对目标模式和你的开发问题以及问题的环境有深刻理解。同时在利用模式时,不要生搬硬套,在找不到最合适的模式时,你可以考虑在已有的模式的基础上进行扩展或修改实现自己的模式。下面我们先来看一下利用模式的好处:
1. 模式可以被很好的共享
模式是一种解决方案,通过对模式的规范化和文档化,它可以在项目、公司甚至是公司之间进行共享。这个共享的范围取决于模式的创建者创建模式的意图。当前互联网上有很多已存在的模式可以被我们使用,最著名的莫过于"四人帮"(GoF)模式。Rational XDE提供了对"四人帮"模式的完全支持,包括对某些指定编程语言的实现。
2. 模式通过已经定义好的解决方案来解决问题
模式包含在一定环境下解决特定问题的专家经验和方法。模式的用户依靠良好的模式文档来选择和应用模式。用户需要知道模式能够解决什么样的问题,并且需要了解模式是如何解决问题和应用模式的过程逻辑。因此好的模式应该包括好的模式文档。
3. 模式可以被广泛的应用
模式可以在软件开发的各个阶段被使用。你可以创建一个解决单一问题的模式或者针对某一用例应用的模式。一个模式也可以使用其他的模式或者模式系统来解决复杂的问题。模式的设计类型可以包括结构化的、行为化的和条件化的解决方案,因此,模式的应用范围是非常广阔的和灵活的。
4. 模式可以很好的提升软件的重用性
软件的重用包括系统的创建、修补和软件组件的维护和。创建和使用模式可以促进软件的重用,模式一旦被创建便可以被多次的使用。使用模式可以通过避免重新设计来节省开发的成本,重用可以不断的提高软件的质量和可靠性。
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来浏览和编辑它。模式模板用资产<<Asset>>原型来表示,如图1所示。从图1中我们可以看到名为RASPackage1的模式模板,其中包含模式的设计模型以及模型中类的定义。
图1: 模式模板
模板参数(template parameter)
模式的设计人员必须为模式模板设置模板参数,哪怕模式模板本身不需要参数,这个模板参数也是必须的。你可以为模板参数设定缺省的值,或者在模式的应用时为模板参数赋值。
根上下文(Root Context)
根上下文是模式的一个属性,用它来指明模式模板的一个模式内容被应用的范围,这个范围可以是模式模板内容体的整体,也可以是模式模板内容体中的一个包或者一个类。通过这个设置我们可以实现相同的模型的不同部分可以被不同的模式使用。
绑定和绑定点(binding and binding location)
绑定是模式中的参数被赋予具体的参数值的过程,这个参数值可以是用户指定的一个模型元素,也可以是用缺省值自动创建的元素。当一个模式被应用之后,在指定的绑定点中就有一个绑定对象被创建,它被用来维护这个模式的模板参数和具体的参数值之间的绑定关系。你可以直接在绑定对象中修改被绑定的参数值。在缺省的情况下,绑定点和扩展点是同一位置。
扩展点(expansion location)
扩展点是在使用模式时,模式实现文件存放的地方。你必须要为模式的应用设置它。
模式的应用
如果你只想在你的应用开发中使用模式,这个部分的内容对你来说是最重要的。我们将从模式使用者的角度来详细的说明在Rational XDE中如何应用已存在的模式。我们将对这个过程中的每一个步骤进行详细的讲述。
步骤1:选择模式、学习模式使用方法
在使用模式之前,我们必须根据实际的需要来选择适合你的软件开发的模式。如果你对模式还不是很了解,你首先需要学习模式的基本知识和概念,《设计模式》一书是学习模式的不错选择。我们这里假定你对模式已经有了一定的了解,现在我们选择"四人帮"模式中的 Facade模式作为我们学习模式应用的例子。如果你对Facade模式并不了解,没关系,在这里我们会对Facade模式的使用环境、解决的问题和使用方法做全面的介绍。在Rational XDE中,支持很多经典的模式,"四人帮"模式就是其中的一些。你可以通过XDE工具菜单中的Patterns菜单项的子菜单项Organize Favorites来设置可用的模式。
图2:组织模式对话框
如图2所示,你可以添加你需要的模式到XDE中,这样你就可以在你的应用开发中使用其他人开发的模式。但要注意的是在XDE中,模式是按照RAS资产的形式被组织的,模式被存放在RAS的资产库中,资产库的文件形式是ras为扩展明的,比如你可以在XDE的按章目录下的\addins\Patterns\content\GoF\Java\v2.5目录下找到名为GoF.ras的文件,这个文件中存放了"四人帮"的模式。也就是说其他人创建的你希望使用的模式也必须符合RAS标准才可以在XDE中使用。你可以访问 Rational 开发者网络(RDN)中的 模式交换区域,,这里有很多已经被开发的模式可以用来加速你的软件开发过程。
现在我们来了解一下Facade模式的内容。我们来看一下Facade模式的文档,为了查看模式的文档我们首先需要在模式浏览器(Pattern Explore)中打开模式,可以通过菜单Tool > Patterns > Open Favorites Libray > GoF Pattern Libray for Java V2.5来打开整个"四人帮"模式库,这时你将在模式浏览器中看到"四人帮"中的所有模式,如图3。
图3: 模式浏览器
用鼠标选中Facade模式,然后在窗口菜单中选择显示视图 > Pattern Documentation,你将会看到模式文档视图,如图4。
图4: 模式文档视图
模式的文档为你提供了模式的应用环境、能够解决的问题以及在XDE中应用模式的方法。下面我们来看一下模式文档中的各个部分。
Short Description: 简要的对模式进行描述。
Version: 模式的版本
Last Modified Date: 模式的修改时间
上面的部分是模式的基本信息,下面是模式文档的主题部分。
Participants: 参与者代表了模式模板的参数,它描述了这个模式中的每一个模式模板参数的在模式中的作用、数量关系、类型、参数值的来源、缺省值和代码模板的使用。
在Facade模式中有三个参与者:Facade、SubsystemInterface和operation。
Facade参与者知道哪一个子系统负责处理用户的请求,并将请求转发给适当的子系统对象。它的类型是Class,它的参数值的来源可以是用户提供的已存在的类,也可以有XDE为你新创建一个类。这个参与者被设定了缺省值Facade,这意味着如果你不为它设定参数值,它将使用Facade作为参数值使用。
SubsystemInterface参与者实现了子系统的功能,它处理被Facade转发过来的用户请求。它的类型是Class,参数值的来源是用户提供已存在的处理类。用户需要在应用Facade模式之前构建好这个子系统类。
Operation参与者是子系统处理用户请求的操作或者可以说是函数。它的类型是操作(operation),参数值的来由可以是用户提供或者来自于集合。
下面我们通过模式的类图和时序图来了解模式中参与者之间的关系。
图5:Facade模式的类图
在这个类图中我们可以看到参与者Facade和SubsystemInterface之间的关系。请注意在这个图中你可以发现有<%=Facade%>的表达式,这里Facade代表了模式模板的一个参数,在应用模式时通过为这个参数赋值可得到相应的类名,比如你可以将FacadeTest赋给它,这样产成的Facade类的名字就是FacadeTest,而其他引用了Facade参数的地方的值也是FacadeTest。当你应用了这个模式后,这个类图也会出现在你的模型中,与这个图不同的是参数部分已经被赋值了。
图6:Facade模式的时序图
图6是Facade的时序图,它描述了模式中各个对象的交互关系。在应用了这个模式后,这个时序图也会在你的模型中出现,与这个图不同的是参数部分已经被赋值了。
Classification部分描述了作为RAS资产模式的信息。
Author : 模式的作者,可用来对模式进行检索
Packager: 模式的包装者
Keyword : 用于检索的关键词
Problem Solved : 模式解决的问题
Benefit : 使用这个模式的好处
Usage 部分描述了应用这个模式的步骤和活动
现在我们已经对Facade模式中的参与者以及他们之间的关系和模式能够解决的问题有了一定的了解,接下来让我们开发使用这个模式。
步骤2:应用模式
如果你对前面讲的XDE中模式的概念以及Facade模式的各个部分都已经理解了,应用模式的过程就非常的简单,我们可以把它看作是一个给模式模板的参数赋值的过程。
首先我们需要创建一个Java建模项目,在这个项目中应用Facade模式。通过以下步骤来创建Java 建模项目:
文件 > 新建 > 项目 弹出新建项目对话框见图7
图7: 创建Java建模项目
在新建项目对话框的右边的浏览栏中选择Modeling,然后在新建项目对话框的右边的浏览栏中选择Java Modeling Project。
点击下一步,在项目名的文本框中输入FacadeTest。点击完成。XDE将为你创建Java建模项目,如图8。
图8:Java 建模项目
在Model Explore视图中,你可以看到刚创建好的项目Java Code Model,在XDE的右边是我们刚才打开的模式浏览器(Pattern Explore),一会我们将在这里开始应用Facade模式。现在我们的任务是创建一个代表子系统的类,这是Facade模式的SubsystemInterface参与者的要求。我们简单的创建一个名为SubSystem的类。步骤如下:
在模型浏览器(Model Explorer)鼠标右键点击Java Code Model,选择 Add UML > Class,命名为SubSystem。
然后为类SubSystem添加一个操作名为test()。这个操作将成为Facade 模式operation模式模板参数的值。步骤如下:
鼠标右键点击类SubsystemInterface,选择 Add UML > Operation,命名为test。
接下来开始应用模式Facade,步骤如下:
在模式浏览器(Pattern Exlpore)中鼠标右键点击Facade模式,选择 Apply this pattern。应用模式向导样式选择器对话框弹出,如图9
图9: 应用模式
选择Apply Pattern Dialog,应用Facade模式对话框弹出如图10。
图10:应用Facade模式对话框
这个对话框分为几个部分,最上面是模式描述部分,它简要的说明了Facade模式的用途。接下来的部分是模式模板参数信息部分,这是我们应用模式的核心部分,在这里我们需要为模式模板的参数赋值。在Facade模式中我们需要为四个参数进行赋值。
Facade参数:类型为Class因此我们需要为他设定一个类,在Facade参数的值域中我们可以看到已经有 了一个Facade的值,这是Facade模式的缺省值,如果你不希望用这个缺省值,可以通过鼠标双击值域弹出如图11的对话框。
图11:Facade的选择参数值对话框
你可以重新设定Facade参数的值,这里我们用缺省的值Facade。
接下来为SubSystemClass参数赋值,这个参数的类型为Class,我们要为它指定一个类,这个参数没有缺省值,因此我们必须为它分配一个。双击SubSystemClass参数的值域,弹出SubSystemClass参数的选择参数值对话框如图12
图12: SubSystemClass的选择参数值对话框
在对话框的左边浏览栏中选择我们之前创建好的SubSystem类,点击Select按钮,这样我们就为SubSystemClass设定了值。SubSystemClass将有SubSystem类来代替。
接下来为参数operation赋值,operation的参数类型为操作,因此我们要为它设定一个操作值。如图13
图13: operation的选择参数值对话框
在对话框的上方可以看到两个选项:User和Collection. 选择User意味着需要我们设定一个操作作为参数值,Collection表示可以选择多个操作的集合作为参数值。这里我们选择User选项,并在对话框的左边的浏览兰中找到之前我们创建好的SubSystem类的test() 操作作为参数值。
接下来为SubSystem参数赋值,它的类型为包, 并且有缺省的值SubSystem,这个参数的作用是将生成模式中的元素是存放的包。我们使用缺省值SubSystem,在生成模式元素时,你将会看到一个名为SubSystem的包被生成,在这个包之下是模式的模型元素。
我们已经为Facade模式的四个参数赋了值,接下来的事情是设定扩展点和绑定点。前面我们已经介绍过了扩展点和绑定点的概念,扩展点是生成模型的模型元素的存放地点,绑定点是指绑定对象的存放地点,
这里我们都选择Java Code Model包。这样我们就已经为Facade模式设定好了所有的参数值,如图14
图14:为Facade模式的参数赋值
下面点击Apply按钮完成模式的应用,XDE将根据我们设定的参数值为我们产生模式的模型元素。我们已经成功的完成了应用Facade模式的步骤,下面我们来看看应用模式为我们生成了哪些模型元素。首先我们来看一下模型浏览器中的内容,见图15
图15:应用模式Facade生成的模型元素
首先我们可以看到在Java Code Model下有一个叫做Subsystem的包,这是根据Facade模式的Subsystem参数值创建的。在这个包下可以看到两个类的模型Facade和SubSystem,他们的名字也是根据前面我们设定的参数值制定的。与包Subsystem平行有一个名为 Facade Participants的类图如图15
图16:应用 Facade模式生成的类图
和在模式Facade中的类图相比可以发现,他们的区别只在于Facade模式模板的参数被我们所设定的参数代替了。
与Facade Participants的类图平行的还有一个名为AccessSubystem的协作的实例,见图16
图17
在模型浏览器中可以看到AccessSubystem协作实例中包含了几个对象(aClient、aFacade和aSybsystemClass),还有一个交互实例,交互实例描述了系统中某些对象间的交互过程,典型的使用时序图来表示。双击时序图AccessSubsystem你可以看到Facade模式产生的时序图,见图17
图18:Facade模式生成的时序图
在图中你可以发现与Facade模式中的时序图的区别就在于模式模板的参数被我们赋的值代替了。
到此为止我们已经完整的经历了一次应用模式的过程。在XDE中应用模式可以为你创建模式实现的框架,在生成的框架的基础上进一步的细化来完成模式的实现。