<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xiaoxiaoleemin

    天道酬勤,小小加油
    posts - 19, comments - 12, trackbacks - 0, articles - 0
        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,那么還有另外的知識需要學習。

    Feedback

    # re: 《EMF:A Developer's Guide》讀書筆記第二章 :EMF簡介(下)  回復  更多評論   

    2007-05-04 22:16 by lunzi
    嗯,不錯!
    主站蜘蛛池模板: 夜夜亚洲天天久久| 1000部羞羞禁止免费观看视频| 久久精品国产亚洲AV无码偷窥| 国产成人无码免费视频97| 日日麻批免费40分钟无码| 最好2018中文免费视频| 亚洲国产区男人本色在线观看| 久久久综合亚洲色一区二区三区| 亚洲国产精品人人做人人爱| 夭天干天天做天天免费看| 精品熟女少妇av免费久久| 一区二区3区免费视频| 亚洲欧美在线x视频| 亚洲色大成网站WWW国产| 亚洲精品午夜久久久伊人| 精品国产亚洲一区二区三区| 亚洲第一区在线观看| 国产精品免费_区二区三区观看| 中文字幕无码成人免费视频 | 全部免费a级毛片| 操美女视频免费网站| 免费下载成人电影| 1000部拍拍拍18勿入免费视频软件| 日本高清高色视频免费| 国产无遮挡裸体免费视频在线观看 | 色欲aⅴ亚洲情无码AV蜜桃| 亚洲天堂电影在线观看| 久久综合亚洲色HEZYO社区| 中文字幕亚洲综合精品一区| 久久精品国产亚洲AV麻豆王友容 | 乱淫片免费影院观看| 日韩毛片在线免费观看| 成人精品国产亚洲欧洲| 国产成人精品久久亚洲高清不卡| 亚洲中文字幕无码久久2020| 亚洲综合无码一区二区痴汉| 亚洲一卡2卡三卡4卡无卡下载 | 国产精品四虎在线观看免费| 国产成人免费a在线视频色戒| 国产女高清在线看免费观看| 免费一级特黄特色大片在线观看|