1.Notification and Adapter
EMF生成的每一个类q是一个NotifiercdQ因此当它的属性或者引用改变的时候可以发出通知。这是一个很重要的性质Q通过监听EObject的变化可以及(qing)时地更新视图或者与之相兌的对象。EMF中的Notification ObserverQListenerQ叫做AdapterQ它除了(jin)监听事g以外Q还可以扩展其它行ؓ(f)(extend behavior){。一个Adapter可以通过如下的方式添加到M一个EObject对象上(比如PurchaseOrderQ:(x)
Adapter poObserver = 
aPurchaseOrder.eAdapters().add(poObserver);
然后Q当aPurchaseOrder的状态发生变化时Q比如setBillToҎ(gu)发生?jin)?j)QpoObserver的notifyChanged()Ҏ(gu)?x)被调用?br> EContentAdapter,可以dC个根元素Q一个资源或者一个resource set,它可以监听这些元素的M子元素的状态变?
Adapter在实现behavior extension(比如不通过l承来实现某个接口的功能Q的功能Ӟ是通过AdapterFactory来完成的。比如:(x)
POAdapter adapter = (POAdapter)somePOAdaterFactory.adapt(someObject,POAdapter.class);
q样QPOAdaptercd的adapter对象被添加到?jin)对象someObject上?br>
2.Object Persistence
EMF对Q何model的默认的序列化方式是XMI。有两个跟序列化相关的函敎ͼ(x)eContainer()和eResource().下面通过例子来看q两个方法的作用Q?br>
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);
q里PurchaseOrder和Item分别是模型中代表订单和订单项的类。这时如果调用item.eContainer()?x)返回order对象。但是如果调用order.eContainer()则会(x)q回nullQ因为它没有被包含在M元素里边。这时order和item的eResource()Ҏ(gu)都会(x)q回null?br> Z(jin)序列化这些对象,我们应该把它们加入到一个Resource里边。Resource是一个代表吴立存储位|(如文Ӟ(j)的接口。我们只需要把根元素加入到Resource中即可?br>
Resource resource =
;
resource.getContents().add(order);
q时order和item的eResourceQ)(j)Ҏ(gu)都会(x)q回resource对象Q其中item是通过order加入到resource中去的。这时调用resource.save(null)后两个对象就保存?sh)来了(jin)?br> 但是Q如何取得resource呢?可以借助于EMF中的ResourceSetQ?它是创徏Resource的工厂,是一pdresource的集合?br>
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);
保存完成之后Q如何读取呢Q?
PurchaseOrder order = (PurchaseOrder)resource.getContents().get(0);
ResourceSetq支持跨文档的引用(cross-document reference)Q当遇到跨文档的引用Ӟ先用proxy对象来代替实际的对象Q当W一ơ真正用这个对象的时候才resolve成真正的对象。Proxy是一个关于目标类的一个未初始化的对象Q但是它拥有实际对象的URI?br>
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Ҏ(gu)比直接调用order的setShipTo()和getShipTo()效率要低一些,因ؓ(f)它要switch做一些条件判断,但是它的优点是open up the model for completely generic access.EMF.Edit中的AddCommandQSetCommand{通用的命令就是通过q种方式实现的?br>
4.Dynamic EMF
在没有生成模型中各个cȝ代码之前Q我们也可以使用他们的对象,如下Q?br>
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);
...
接下来,我们可以q样初始化这些类的对象:(x)
EFactory factory = package.getEFactoryInstance();
EObject order = factory.create(orderClass);
order.eSet(shipToAttribute, “123 street");
x(chng)QEMF的基本知识就介绍完了(jin)Q如果你只是需要EMF产生的Model CodeQ那么需要学?fn)的东西p么多?jin)。如果你q需要EMF产生的Edit Code和Editor CodeQ那么还有另外的知识需要学?fn)?br>

]]>