站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题基于Design Pattern Toolkit的开发

基于Design Pattern Toolkit的开发

摘要: 设计模式工具箱(Design Pattern Toolkit)是基于Eclipse的模板引擎,它向用户提供一个模型驱动的框架,帮助用户简化应用程序的开发。用户通过模板定制应用程序的必要信息,设计模式工具箱帮助用户自动生成应用程序的所有构件。使用设计模式工具箱将显著的加速常见应用程序的开发,与此同时,设计模式工具箱向用户提供了构建一类应用程序的最佳实践,因此,使用它将帮助用户分享最佳实践的价值。

1 内容简介

设计模式工具箱(Design Pattern Toolkit)是基于Eclipse的模板引擎,它向用户提供一个模型驱动的框架,帮助用户简化应用程序的开发。用户通过模板定制应用程序的必要信息,设计模式工具箱帮助用户自动生成应用程序的所有构件。使用设计模式工具箱将显著的加速常见应用程序的开发,与此同时,设计模式工具箱向用户提供了构建一类应用程序的最佳实践,因此,使用它将帮助用户分享最佳实践的价值。

本文首先介绍设计模式的基本概念,然后介绍设计模式工具箱(Design Pattern Toolkit)的框架,接着,本文通过两个例子分别介绍如何使用设计模式工具箱中已有的设计模式,以及如何编写新的设计模式。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

2 设计模式

设计模式描述了软件开发中经常出现的一类问题,以及这类问题的核心解决方案。使用此方案,用户将更加快捷而有效地开发解决此类问题的应用程序。设计模式通常由以下元素组成:

具体的说,开发某类应用程序(如,Portlet, Web Service, 或者 UML Profile)的专家对应用程序的实现步骤进行编码(Encoding),实现步骤可能包括获取应用的需求以及生成应用程序的所有构件。编码的结果称为模式(Pattern),其他开发人员只要使用此模式(事实上,它是专家的知识财产)就能够轻松的生成类似的应用程序。




图1显示如何使用设计模式开发应用程序,应用程序的开发人员通过XML文件提供应用程序关键信息的描述,并选择合适的模式,最后由引擎根据用户提供的程序描述以及所应用的模式自动生成应用程序的所有构件。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

3 Design Pattern Toolkit框架

设计模式工具箱(Design Pattern Toolkit)中模式的结构是模型-视图-控制器(Model-View-Controller),模式是专家的经验总结,使用模式,能够帮助用户自动生成组成结构复杂的应用程序(如,数据库bean,J2EE应用程序,Eclipse插件等)。下面分别介绍模型,视图以及控制器:

模型(Model)是一个隐式的XML Schema,它描述了哪些特定信息对于应用程序是必须的 (如,Java Bean中所有属性的名称和类型,UML Profile中Stereotype的名称及其包含的所有属性)。针对每个具体的应用,用户需要编写一个应用程序定义文件(appdef),而所有同类型的应用程序定义必须遵循唯一的Schema。设计模式工具箱的一个优点是,它不会僵死的定义各种应用程序必须参照的Schema;相反,它赋予了模式开发人员极大的自由,由他们决定构建应用程序必需的各种信息,以及各种信息将被如何获取。

视图(View)是一个模板的集合,模板由静态文本和模板标签组成,模板标签指导如何从模型(appdef)中抽取信息,以及如何将这些信息插入到静态文本中。通过使用模板标签,可以帮助用户生成不同种类的资源,标签本身并没有限制它们能够被使用在什么样的模板中。一个模板可以被拆分成子模板,每个子模板负责生成应用程序的一部分,在实际执行中,不同的子模板被引擎有序的调用。例如,为源代码中的方法生成参数是最常见的模式之一,它应该被抽取出来作为独立的子模板,从而能够被其他模板所调用。

控制器 (Controller)也是一个模板,它由一系列的静态文本和模板标签组成,它的功能是控制视图模板何时以及如何被应用。控制模板对于输出的内容进行精细的控制,甚至可以细致到输出文本间的分隔符。控制模板支持多个appdef的输入,由模板标签控制如何从不同的模型(appdef)中获取信息,以及如何对不同的信息进行组合。因此,用户在设计模型时,能够从不同的方面描述整个模型,并把每个方面定义在一个appdef中,从而强化了模型层面的复用。例如,开发人员在设计模式时,把命名规范从模式的主流程中剥离出来,用不同的appdef定义主流程和命名规范。

模式使用人员通过appdef定义应用程序的模型,它通常是一个XML文件(也可以采用其他的格式,但前提是用户必须自己编写解析器)。当使用人员选择应用一个模式的时候,引擎获取appdef以及该模式的视图模板和控制器模板,最后,生成一个端到端的应用程序,它可以包含各种Eclipse资源,同时跨越若干个Eclipse的项目。当引擎产生完所有的Eclipse资源后,building和validation 操作自动执行。自动生成的Eclipse资源可能需要经过少量的修改,才能正确的运行。设计模式工具箱提供Round Tripping机制,用户只要在Eclipse资源中被修改过的地方作Round Tripping标记,再次运行转换时,这些地方不会被覆盖。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

4 利用已有的模式进行开发

本节以一个具体的应用开发为例,介绍如何利用Design Pattern Toolkit中已有的模式加速应用程序的开发。

本节介绍的模式为UML Profile自动生成模式。使用UML Profile对UML的模型进行扩展已经是一个被广泛采用的标准做法,诸如RSA(Rational Software Architect)等基于Eclipse的集成开发工具,已经提供了图形的方式,帮助用户订制UML Profile。图2显示了UML Profile的基本组成元素:

既然用户能够通过图形界面,手工的建立UML Profile文件,使用Design Pattern Toolkit进行开发似乎显得有点笨拙,在下结论之前,请考虑这样的场景,UML Profile被用来描述IBM的各种IT产品(数量的巨大不言而喻),产品的开发人员可能并不了解如何使用建模工具去定制Profile,而且产品自身也在不断的升级和变更当中,因此,向产品开发人员提供一种直观的方式开发和维护产品的Profile十分必要。本节介绍如何使用设计模式工具箱中的UML Profile模式,帮助开发人员自动生成UML Profile。




4.1 创建新的插件工程

通过新建工程向导创建一个插件工程。从主菜单中选择 New -> Project -> Design Pattern Toolkit, 然后选择 Import Pattern into new Project 选项,因为我们不但要创建一个新的设计模式工程,还要利用已有的模式进行开发。

点击 Next,进入 New Template Set Project页面,在Project Name条目中输入项目名称。

点击 Next, 进入Import Pattern页面,在此,用户指定引用的模式,模式通常定义在以.patzip为后缀的文件中,com.ibm.dptk_3.0.5.0\samples 目录下保存了已经设计好的模式,选择TXMPatterns\umlProfile.patzip,点击 Finish, 新的插件工程自动生成,且工程包含了umlProfile模式。

图3显示了选择创建新的Design Pattern Toolkit插件工程向导的界面。




4.2 修改视图模板或控制模板

执行完4.1节所示的步骤,您将在Eclipse的 Workspace中看到新创建的插件工程。打开插件工程,您将看到plugin和profile两个文件夹,它们包含了umlProfile模式的视图模板。





<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
"
   name="Plugin Plug-in"
   version="1.0.0"
   provider-name=""
   class=".
   ">

   
      ">
         
      
   
   
      
      
      
      
   
   
         
 _PROFILES" plugin="" path="profile"/>
   
   

      
_PROFILES/"
            name=""/>
           
   

</td></tr></table>

表1向您展示了umlProfile.patzip中包含的所有模板文件,您可以在已有模板基础上做任意的修改,以适合应用程序的需求。

我们通过一个简单的模板文件(图4),向您介绍如何通过模板标签从模型中提取数据,并插入静态文本中。plugin.xml.pat文件定义了plugin.xml的视图模板,它由静态文本以及模板标签两部分组成。plugin.xml.pat由两种类型的标签组成:标签。

标签被用来提取输入的XML文件中节点属性的值,通常包含node, name, 以及format属性:node属性为一个xpath表达式,通过它,可以查找到appdef中的特定节点;name指定了node的一个属性名;format定义了如何对属性值进行格式化。

标签被用来提取nodes中定义的所有节点,对于每个节点,把它与name的值关联起来,这样在循环体中,该节点能够以name的值进行引用。

4.3 编写模型文件appdef

模型文件appdef通常为XML格式,模式的设计人员定义一个隐式的XML Schema,该Schema描述了appdef文件中应该包含哪些信息,以及这些信息如何被组织。针对UML Profile模式,我们编写模型文件(图5):



<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>



        
            
                
                
                
                
                
            
            
                
                
                
                
            
            
                
                
                
            
        
       

</td></tr></table>

4.4 应用UML Profile模式

选择sample.appdef文件,点击右键,选择弹出菜单中的"Apply Pattern"条目,这时设计模式工具箱搜索所有已经定义的模式,每个模式保存在一个.patzip文件中。您可以通过Window -> Preferences -> Patterns 修改模式文件的搜索路径。

当您选择"Apply Pattern"后,搜索路径(包括其子目录)下的所有模式将被列举在一个弹出对话框中,如图6所示。值得注意的是,当前工程中的模式也会被列举出。选择"UML Profile Pattern [profileDPTK]",点击OK,模式将被应用。

当模式被成功的应用,您将看到图7所示的对话框。这时,所有的Eclipse资源已经被生成。







4.5运行结果

当模式被成功的应用,在您的Workplace下会产生一个新的工程,名称为"demo.gerken.profile.plugin",当然,这取决与您在appdef文件中如何定义plugin的id。




展开demo.gerken.profile.plugin工程,可以看到,该UML Profile插件工程包含了视图模板中定义的所有构件,它们分别是:

至此,您应该体验到使用设计模式工具箱开发应用程序的高效。如果用户接受视图模板和控制模板中缺省的设置,他仅需要提供基于XML的appdef文件,然后点击"Apply Pattern",应用程序就被自动的生成。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

5 开发新的模式

除了利用设计模式工具箱中现存的模式外,用户还可以开发新的模式,新开发的模式应遵循模型-视图-控制器的架构。新开发的模式被打包为.patzip文件,并拷贝在模式文件目录下,成为工具箱中新的模式。

本节以一个简单的例子向您展示如何编写一个新的模式。编写新的模式涉及以下几步:首先定义隐式的Model Schema,然后编写视图模板,最后编写控制器模板。本节所展示的例子是编写Java Bean模式,您将发现,使用模板将有效的提高应用开发人员的效率。

5.1 定义隐式的Model Schema

Java Bean由一系列的属性构成,每个属性又被赋予了类型。虽然不同的Bean有不同的属性或者不同类型的属性,但Java Bean的代码中,无论是属性的定义还是get,set操作都遵循着一定的规律。

隐式的Schema,指appdef文件所遵循的规范,不必使用实际的Schema进行定义,它仅作为模式开发人员和模式使用人员之间共享的知识存在。下面我们来看一个具体的appdef的例子



<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>


   
      com/ibm/education
      
      
      
   
   
      com/ibm/education
      
      


</td></tr></table>

从以上的模型,我们了解到,对与每个,必须指定它所在的包,以及Bean中各种属性的定义。

5.2 定义视图模板

视图模板由静态文本和模板标签组成,模板标签指导如何从模型(appdef)中抽取信息,并如何将这些信息插入到静态文本中。下面给出Java Bean模式的视图模板,它保存在bean.pat中。



<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

package ;
public class  {

  ;

    /* Constructor for  */
public () {
   super();
}

/**
 * Gets the 
 * @return Returns a 
 */
public 
get () {
    return ;
}
/**
 * Sets the 
 * @param 
The  to set
 */
public void set
( ){
    this. = 
}

}
</td></tr></table>

针对以上视图模板,有几点需要解释:

1.标签被用来从应用定义中抽取节点的内容。

2.标签被用来获取appdef中节点属性的值,format="U1"意味着该字符串的首字母为大写。

3.标签定义了一个循环,对于每个节点,把它与name的值关联起来,这样在循环体中,该节点能够以name的值进行引用。

4.不同标签之间可以存在多级牵套。

5.3 定义控制模板

控制模板提供了对视图模板的管理和控制,图11是Java Bean的控制模板control.pat文件。



<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>


   "
      template="bean.pat" />

</td></tr></table>

上述控制模板使用了标签,该标签用来生成Eclipse的各种资源文件,resource定义了资源文件保存的位置,template定义了视图模板的位置。控制模板的执行结果是,针对appdef中的每个bean,自动生成一个符合视图模板bean.pat的Java文件。

5.4 Export模式定义

选择插件工程,点击右键,从弹出菜单中选取 "Export Pattern to Zip File",指定合适的位置保存模式的压缩文件(.patzip)。该文件可以通过任何方式传送给设计模式工具箱的使用人员,他们只要把此文件拷贝在模式文件目录下,即添加到工具箱中。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

6总结

设计模式工具箱(Design Pattern Toolkit)向用户提供了一个模型驱动的框架,简化了应用程序的开发。使用设计模式工具箱将显著的加速应用程序的开发,与此同时,设计模式工具箱向用户提供了构建一类应用程序的最佳实践,因此,使用它将帮助用户分享最佳实践的价值。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>


<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

关于作者<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr align="left" valign="top"><td>

</td><td></td><td width="100%">

IBM中国软件开发实验室SOA设计中心 是IBM全球四个SOA设计中心中最大的一个,成立一年多来,已经取得了可喜的成果。我们在全球范围内实施了多个 SOA 应用项目,为多个行业的客户提供了 SOA 解决方案。我们正在实施的 SOA 项目涵盖了很多的重要行业,包括零售业、航运业、电力、银行、保险等等。通过这些不断增长的成功案例,我们不仅深入地推广了 SOA 的理念,树立了 SOA 成功实施的范例,也为我们的队伍积累了经验,培养了人才。与此同时,我们还是 IBM 开发 SOA 的软件平台 -- SOA Integration Framework -- 的主力军。该产品基于模型驱动的思想,旨在最大化地重用软件资产,它为 SOA 项目的实施提供了一整套源自成功实践的方法论,设计范式和工具集。它的出现将极大地方便 SOA 系统架构师、设计人员、开发人员快速地开发 SOA 应用项目。
参与本文撰写的主要技术人员包括:
刘昱 IBM 中国软件开发实验室 SOA设计中心 软件工程师
李东兵 IBM 中国软件开发实验室 SOA设计中心 软件工程师
田晨 IBM 中国软件开发实验室 SOA设计中心 软件工程师

</td></tr></table>

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>


↑返回目录
前一篇: Eclipse for Linux on POWER 的安装和使用
后一篇: 探索 Eclipse 的 ASTParser