MDA的一个重要思想就是将系统的功能描述和系统在特定平台上的实现分离把系统模型划分成与平台无关的模型( PIM)和与平台有关的模型( PSM) ,并建立这两种模型之间的映射关系。P IM是对系统功能和结构的形式化描述,是抽象的,代表了业务功能和行为,不受具体实现技术的影响。PSM是在特定平台上对系统功能和结构的描述,是具体的,它在PIM中添加了与平台有关的信息。PIM和PSM都是通过UML来描述的。
MDA还定义了模型之间的四种映射关系。①P IM到P IM。该映射是对P IM的精化,主要是从分析模型到设计模型的转换。②P IM到PSM。该映射主要是把抽象模型转换到与目标平台相关的模型。③PSM到P IM。该映射类似于逆向工程,主要是从PSM中提取抽象模型。④PSM到PSM。该映射是对PSM的精化,主要包括组件的实现、封装和配置。
MDA中描述的PIM和PSM属于概念层次上的模型,它们仅仅对模型给出了性质上的描述,没有给出具体的模型结构。如在描述P IM时,指出了P IM是一种平台无关的模型,是对系统功能和结构的形式化描述,它不受实现技术的影响,但是没有描述P IM的具体模型结构。同样它也没有给出PSM的具体模型结构。然而在实现MDA思想的过程中,需要知道P IM和PSM的具体模型结构,这也是实现P IM到PSM转换的前提。
在下面的例子中基于J2EE平台的模型转换技术
给出了一个属于PIM的Domain Model和一个属于PSM的Application Model。
基于J2EE平台的模型转换技术
DomainModel主要用来捕获在P IM中的功能,它定义的业务功能不涉及任何特定技术细节。DomainModel由ServiceModel和ClassModel组成。Service Model描述了系统对用户或外部系统提供的功能,类似于系统的API。ClassModel指定了系统中必要的类,以支持业务的正常开展。通常,当一个用户需要使用某一个系统功能时,用户首先直接与ServiceModel交互,调用其中的某一个功能,然后Service Model使用ClassModel中的若干个类来共同完成这个功能。由此可见,DomainModel是独立于实现技术的面向业务模型,属于MDA模型中的P IM。App licationModel被设计用于开发基于J2EE架构的分布式多层Web 应用。它由DBMS Model, EJB Model和WebModel三个子模型组成,内容覆盖了J2EE开发的相关领域。DBMSModel描述了系统的数据持久性,对应着后台数据库。EJB Model描述了系统的业务逻辑,对应着J2EE多层架构中的业务层。WebModel描述了系统的展现,对应着J2EE多层架构中的Web 层。App lication Model的定义是基于DomainModel的,它的三个子模型也对应到DomainModel中的相关部分,可以从Domain Model生成App lication Model。由此可见,ApplicationModel是基于某些技术或应用程序框架的,但是又独立于具体的代码,属于MDA模型中的PSM。DomainModel是问题领域中独立于技术的模型。App licationModel是实现了Domain Model功能的软件模型。App licationModel不仅实现了DomainModel,而且也符合J2EE应用的多层架构。
从Domain Mode l到Application Model的转换
DomainModel由Service Model和ClassModel组成,是两层结构。App licationModel由DBMSModel, EJB Model和WebModel组成,是三层结构,其中EJB Model又细分为EJBEntityBean和EJBSessionBean。DomainModel和App licationModel的自身结构决定了Domain Model到App lication Model转换的步骤和方法。具体转换方法如图3所示。总的转换方法包括两个方面: ①ClassModel映射到DBMSModel和EJB Model中的EJBEntityBean。②Service Model映射到EJB Model中的EJB2SessionBean和WebModel。
从Application Model到代码的转换
DBMSModel对应后台数据库。在转换过程中, 将根据DBMSModel中的类生成创建数据库表的SQL语句,同时要根据类中关键字属性确定表的关键字。
EJB Model对应J2EE多层架构中的EJB层。在转换过程中, EJB Model中的每个EJBEntityBean和EJBSessionBean分别生成一个EntityBean和一个SessionBean,同时还要生成一个XML配置文件。每个EntityBean 或SessionBean 分别由三个Java文件组成:一个Home接口、一个Remote接口和一个实现接口的Bean类。在EJBEntityBean生成EntityBean时,需要在Home接口中加入Create和findByPrimaryKey方法;在Remote接口中加入EJBEntityBean的所有方法;在实现接口的Bean类中,除了需要把EJBEntityBean的所有属性和方法加入到其中之外, 还要加入ejbCreate, ejbPostCreate, ejbLoad, ejbStore, ejbRemove, ejbActivate, ejbPassivate, setEntityContext和unsetEntityContext方法。在EJBSessionBean生成SessionBean时,需要在Home接口中加入Create方法;在Remote接口中加入EJBSessionBean的所有方法;在实现接口的Bean类中,除了需要把EJBSessionBean中的所有属性和方法加入到其中之外,还要加入ejbCreate, ejbRemove, ejbActivate, ejbPassivate和setSessionWebModel对应J2EE多层架构中的Web层。
在转换过程中,WebModel中的每个WebServlet生成一个Servlet。在Servlet中,包括Init, doGet, doPost和Destroy方法,以及WebServlet中的方法。另外,为了生成完整的基于J2EE架构的程序框架,还需要产生前台用户界面。前台用户界面可以由Servlet来产生一一对应的HTML 页面,同时用户可以进行适当的设置,使页面形成特定的风格。