`
yiliner
  • 浏览: 214885 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《EMF:A Developer's Guide》读书笔记第二章 :EMF简介(下)

    博客分类:
  • EMF
阅读更多

EMF Framework提供了模型变化通知、持久化支持、操纵EMF对象的反射API等功能来帮助用户提高工作效率,下面分别详细介绍一下。
    1.Notification and Adapter
    EMF生成的每一个类还是一个Notifier类型,因此当它的属性或者引用改变的时候可以发出通知。这是一个很重要的性质,通过监听EObject的变 化可以及时地更新视图或者与之相关联的对象。EMF中的Notification Observer(Listener)叫做Adapter,它除了监听事件以外,还可以扩展其它行为(extend behavior)等。一个Adapter可以通过如下的方式添加到任何一个EObject对象上(比如PurchaseOrder):

<!---->Adapter poObserver  =  
aPurchaseOrder.eAdapters().add(poObserver);

    然后,当aPurchaseOrder的状态发生变化时(比如setBillTo方法发生了),poObserver的notifyChanged()方法会被调用。
    EContentAdapter ,可以添加到一个根元素,一个资源或者一个resource set,它可以监听这些元素的任何子元素的状态变化.
    Adapter在实现behavior extension(比如不通过继承来实现某个接口的功能)的功能时,是通过AdapterFactory来完成的。比如:

<!---->POAdapter adapter  =  (POAdapter)somePOAdaterFactory.adapt(someObject,POAdapter. class );

    这样,POAdapter类型的adapter对象被添加到了对象someObject上。
   
    2.Object Persistence
    EMF对任何model的默认的序列化方式是XMI。有两个跟序列化相关的函数:eContainer()和eResource().下面通过例子来看这两个方法的作用:

<!---->PurchaseOrder order  =  POFactory.eINSTANCE.createPurchaseOrder();
order.setBillTo("123 Maple Street");

Item item = POFactory.eINSTANCE.createItem();
item.setProductName("Apples");
item.setPrice(0.45);
item.setQuantity(20);

order.getItems.add(item);

    这里PurchaseOrder和Item分别是模型中代表订单和订单项的类。这时如果调用item.eContainer()会返回order对象。但 是如果调用order.eContainer()则会返回null,因为它没有被包含在任何元素里边。这时order和item的eResource() 方法都会返回null。
    为了序列化这些对象,我们应该把它们加入到一个Resource里边。Resource是一个代表吴立存储位置(如文件)的接口。我们只需要把根元素加入到Resource中即可。

<!---->Resource resource  =   ;
resource.getContents().add(order);

     这时order和item的eResource()方法都会返回resource对象,其中item是通过order加入到resource中去的。这时调用resource.save(null)后两个对象就保存下来了。
    但是,如何取得resource呢?可以借助于EMF中的ResourceSet, 它是创建Resource的工厂,就是一系列resource的集合。

<!---->ResourceSet resourceSet  =   new  ResourceSetImpl();
URI fileURI = URI.createFileURI(new File("mypo.xml").getAbsolutePath());
Resource resource = resourceSet.createResource(fileURI);
resource.getContents().add(order);
resource.save(null);

    保存完成之后,如何读取呢?

<!---->PurchaseOrder order  =  (PurchaseOrder)resource.getContents().get( 0 );

    ResourceSet还支持跨文档的引用(cross-document reference),当遇到跨文档的引用时,先用proxy对象来代替实际的对象,当第一次真正使用这个对象的时候才resolve成真正的对象。 Proxy是一个关于目标类的一个未初始化的对象,但是它拥有实际对象的URI。
  
    3.The Reflective EObject API
   
EObject defines a generic,reflective API for manipulating instances.

   
<!---->EClass orderClass  =  POPackage.eINSTANCE.getPurchaseOrder();
EAttribute shipToAttribute = POPackage.eINSTANCE.getPurchaseOrder_shipTo();
orderClass.eSet(shipToAttribute, "123 street");
String shipTo = orderClass.eGet(shipToAttribute);

    上面调用orderClass的eSet和eGet方法比直接调用order的setShipTo()和getShipTo()效率要低一些,因为它要 switch做一些条件判断,但是它的优点是open up the model for completely generic access.EMF.Edit中的AddCommand,SetCommand等通用的命令就是通过这种方式实现的。
   
    4.Dynamic EMF
   
在没有生成模型中各个类的代码之前,我们也可以使用他们的对象,如下:

<!---->EPackage  package   =  EcoreFactory.eINSTANCE.createEPackage();
EClass orderClass = EcoreFactory.eINSTANCE.createEClass();
orderClass.setName("PurchaseOrder");
package.getEClassifiers().add(orderClass);

EClass itemClass =
EcoreFactory.eINSTANCE.createEClass();
itemClass.setName("Item");
package.getEClassifiers().add(itemClass);

EAttribute shipToAttribute = EcoreFactory.eINSTANCE.createAttribute();
shipToAttribute.setName("shipTo");
shipToAttribute.setEType(EcorePackage.eINSTANCE.getEString());
orderClass.getEAttributes().add(shipToAttribute);
...

    接下来,我们可以这样初始化这些类的对象:

<!---->EFactory  factory = package.getEFactoryInstance();
EObject order = factory.create(orderClass);
order.eSet(shipToAttribute, “123 street");

    至此,EMF的基本知识就介绍完了,如果你只是需要EMF产生的Model Code,那么需要学习的东西就这么多了。如果你还需要EMF产生的Edit Code和Editor Code,那么还有另外的知识需要学习。

分享到:
评论

相关推荐

    Eclipse Modeling Framework (EMF) Developer Guide

    ### Eclipse Modeling Framework (EMF) Developer Guide 知识点概览 #### 1. EMF 框架程序员指南 **EMF Framework Programmer's Guide** 部分为开发人员提供了深入理解 EMF 核心框架所需的知识。这部分涵盖了如何...

    EMF Developer Guide

    总的来说,EMF Developer Guide是学习和应用EMF的关键参考资料,它为开发者提供了一个强大而灵活的工具,使模型驱动开发变得更加简单和高效。通过EMF,你可以利用模型的力量,提升软件开发的质量和效率。

    EMF 自学笔记5

    ### EMF自学笔记知识点详述 #### 一、EMF框架概述 EMF(Eclipse Modeling Framework)是Eclipse项目中的一个子项目,它提供了一套用于构建模型驱动的开发工具和应用程序的框架。EMF的主要目标是简化元数据驱动应用...

    EMF Eclipse Modeling Framework 第二版

    ### EMF Eclipse Modeling Framework 第二版 #### 一、概述 《EMF Eclipse Modeling Framework》第二版是由 Dave Steinberg、Frank Budinsky、Marcelo Paternostro 和 Ed Merks 四位专家编写的权威指南。本书是...

    Addison.Wesley.Eclipse.Modeling.Framework.A.Developers.Guide 中文版

    Addison.Wesley.Eclipse.Modeling.Framework.A.Developers.Guide 中文版

    emf文件格式详解

    **微软EMF文件格式详解.pdf**:这份文档很可能是微软官方或第三方专家提供的关于EMF格式的详细指南。通常,它会涵盖EMF的基本结构、记录类型、图形操作、颜色管理、图元定义等内容。通过阅读这份文档,读者可以了解...

    微软emf文件格式详解

    #### 二、EMF格式背景与特点 EMF格式的出现主要是为了满足日益增长的高质量图形处理需求。传统的WMF格式虽然也能够存储矢量图形信息,但在处理高分辨率输出时存在一定的局限性,尤其是在不同分辨率下无法保证图像...

    eclipse Modeling Framework

    Eclipse Modeling Framework: A Developer's Guide By Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, Timothy J. Grose Publisher : Addison Wesley Pub Date : August 11, 2003 ISBN : 0-...

    imdb2emf:将 IMDb 电影数据库解析为 EMF 模型

    imdb2emf:创建 EMF 模型或 TGraphs 的 IMDb 解析器这个小工具从 IMDb 文件创建一个 EMF 模型(或 )。用法您可以克隆这个存储库并安装 Leiningen 来解析 IMDb 文件,也可以下载一个没有依赖项的预编译 JAR。用法:...

    EMF文件提取文本,预览,打印

    EMF(Enhanced Metafile)文件是Windows操作系统中使用的一种矢量图形和图元文件格式。这种文件类型被广泛用于存储图形、图像和打印数据,因为它支持复杂的图形操作,如曲线绘制、渐变填充和透明效果。EMF文件是GDI+...

    将EMF图片格式转换成PNG

    EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...

    EMF.rar_emf

    EMF(Eclipse Modeling Framework)是Eclipse基金会下的一个开源项目,主要用于构建基于模型的软件开发环境。它为开发者提供了强大的模型化工具和框架,支持元数据驱动的开发模式,使得软件设计、开发、验证和维护的...

    emf文件和wmf的转换

    EMF(Enhanced Metafile)和WMF(Windows Metafile)是两种常见的矢量图形文件格式,主要用于存储图像数据,特别是在Windows操作系统环境下。这两种格式都允许无损缩放和复杂图形的绘制,但EMF是WMF的增强版本,提供...

    SVG转EMF的示例代码

    这个"SVG转EMF"的示例代码提供了在Java环境下进行这种转换的方法。首先,你需要一个能够解析SVG并将其转换为图形对象的库,例如Batik,这是一个由Apache基金会开发的开源SVG工具集。 Batik提供了一个SVG渲染器,可以...

    java开发工具EMF插件

    Java开发工具EMF插件是Java开发者在进行模型驱动工程(Model Driven Engineering,MDE)时常用的一个强大工具。EMF(Eclipse Modeling Framework)是Eclipse IDE的一部分,它提供了一种框架和API,用于构建基于模型...

Global site tag (gtag.js) - Google Analytics