1.Notification and Adapter
EMF鐢熸垚鐨勬瘡涓涓被榪樻槸涓涓狽otifier綾誨瀷錛屽洜姝ゅ綋瀹冪殑灞炴ф垨鑰呭紩鐢ㄦ敼鍙樼殑鏃跺欏彲浠ュ彂鍑洪氱煡銆傝繖鏄竴涓緢閲嶈鐨勬ц川錛岄氳繃鐩戝惉EObject鐨勫彉鍖栧彲浠ュ強鏃跺湴鏇存柊瑙嗗浘鎴栬呬笌涔嬬浉鍏寵仈鐨勫璞°侲MF涓殑Notification Observer錛圠istener錛夊彨鍋欰dapter錛屽畠闄や簡鐩戝惉浜嬩歡浠ュ錛岃繕鍙互鎵╁睍鍏跺畠琛屼負(extend behavior)絳夈備竴涓狝dapter鍙互閫氳繃濡備笅鐨勬柟寮忔坊鍔犲埌浠諱綍涓涓狤Object瀵硅薄涓婏紙姣斿PurchaseOrder錛夛細
Adapter poObserver = 
aPurchaseOrder.eAdapters().add(poObserver);
鐒跺悗錛屽綋aPurchaseOrder鐨勭姸鎬佸彂鐢熷彉鍖栨椂錛堟瘮濡俿etBillTo鏂規硶鍙戠敓浜嗭級錛宲oObserver鐨刵otifyChanged()鏂規硶浼氳璋冪敤銆?br> EContentAdapter,鍙互娣誨姞鍒頒竴涓牴鍏冪礌錛屼竴涓祫婧愭垨鑰呬竴涓猺esource set,瀹冨彲浠ョ洃鍚繖浜涘厓绱犵殑浠諱綍瀛愬厓绱犵殑鐘舵佸彉鍖?
Adapter鍦ㄥ疄鐜癰ehavior extension(姣斿涓嶉氳繃緇ф壙鏉ュ疄鐜版煇涓帴鍙g殑鍔熻兘錛夌殑鍔熻兘鏃訛紝鏄氳繃AdapterFactory鏉ュ畬鎴愮殑銆傛瘮濡傦細
POAdapter adapter = (POAdapter)somePOAdaterFactory.adapt(someObject,POAdapter.class);
榪欐牱錛孭OAdapter綾誨瀷鐨刟dapter瀵硅薄琚坊鍔犲埌浜嗗璞omeObject涓娿?br>
2.Object Persistence
EMF瀵逛換浣昺odel鐨勯粯璁ょ殑搴忓垪鍖栨柟寮忔槸XMI銆傛湁涓や釜璺熷簭鍒楀寲鐩稿叧鐨勫嚱鏁幫細eContainer()鍜宔Resource().涓嬮潰閫氳繃渚嬪瓙鏉ョ湅榪欎袱涓柟娉曠殑浣滅敤錛?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);
榪欓噷PurchaseOrder鍜孖tem鍒嗗埆鏄ā鍨嬩腑浠h〃璁㈠崟鍜岃鍗曢」鐨勭被銆傝繖鏃跺鏋滆皟鐢╥tem.eContainer()浼氳繑鍥瀘rder瀵硅薄銆備絾鏄鏋滆皟鐢╫rder.eContainer()鍒欎細榪斿洖null錛屽洜涓哄畠娌℃湁琚寘鍚湪浠諱綍鍏冪礌閲岃竟銆傝繖鏃秓rder鍜宨tem鐨別Resource()鏂規硶閮戒細榪斿洖null銆?br> 涓轟簡搴忓垪鍖栬繖浜涘璞★紝鎴戜滑搴旇鎶婂畠浠姞鍏ュ埌涓涓猂esource閲岃竟銆俁esource鏄竴涓唬琛ㄥ惔绔嬪瓨鍌ㄤ綅緗紙濡傛枃浠訛級鐨勬帴鍙c傛垜浠彧闇瑕佹妸鏍瑰厓绱犲姞鍏ュ埌Resource涓嵆鍙?br>
Resource resource =
;
resource.getContents().add(order);
榪欐椂order鍜宨tem鐨別Resource錛堬級鏂規硶閮戒細榪斿洖resource瀵硅薄錛屽叾涓璱tem鏄氳繃order鍔犲叆鍒皉esource涓幓鐨勩傝繖鏃惰皟鐢╮esource.save(null)鍚庝袱涓璞″氨淇濆瓨涓嬫潵浜嗐?br> 浣嗘槸錛屽浣曞彇寰梤esource鍛紵鍙互鍊熷姪浜嶦MF涓殑ResourceSet錛?瀹冩槸鍒涘緩Resource鐨勫伐鍘傦紝灝辨槸涓緋誨垪resource鐨勯泦鍚堛?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);
淇濆瓨瀹屾垚涔嬪悗錛屽浣曡鍙栧憿錛?
PurchaseOrder order = (PurchaseOrder)resource.getContents().get(0);
ResourceSet榪樻敮鎸佽法鏂囨。鐨勫紩鐢紙cross-document reference)錛屽綋閬囧埌璺ㄦ枃妗g殑寮曠敤鏃訛紝鍏堢敤proxy瀵硅薄鏉ヤ唬鏇垮疄闄呯殑瀵硅薄錛屽綋絎竴嬈$湡姝d嬌鐢ㄨ繖涓璞$殑鏃跺欐墠resolve鎴愮湡姝g殑瀵硅薄銆侾roxy鏄竴涓叧浜庣洰鏍囩被鐨勪竴涓湭鍒濆鍖栫殑瀵硅薄錛屼絾鏄畠鎷ユ湁瀹為檯瀵硅薄鐨刄RI銆?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鐨別Set鍜宔Get鏂規硶姣旂洿鎺ヨ皟鐢╫rder鐨剆etShipTo()鍜実etShipTo()鏁堢巼瑕佷綆涓浜涳紝鍥犱負瀹冭switch鍋氫竴浜涙潯浠跺垽鏂紝浣嗘槸瀹冪殑浼樼偣鏄痮pen up the model for completely generic access.EMF.Edit涓殑AddCommand錛孲etCommand絳夐氱敤鐨勫懡浠ゅ氨鏄氳繃榪欑鏂瑰紡瀹炵幇鐨勩?br>
4.Dynamic EMF
鍦ㄦ病鏈夌敓鎴愭ā鍨嬩腑鍚勪釜綾葷殑浠g爜涔嬪墠錛屾垜浠篃鍙互浣跨敤浠栦滑鐨勫璞★紝濡備笅錛?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);
...
鎺ヤ笅鏉ワ紝鎴戜滑鍙互榪欐牱鍒濆鍖栬繖浜涚被鐨勫璞★細
EFactory factory = package.getEFactoryInstance();
EObject order = factory.create(orderClass);
order.eSet(shipToAttribute, “123 street");
鑷蟲錛孍MF鐨勫熀鏈煡璇嗗氨浠嬬粛瀹屼簡錛屽鏋滀綘鍙槸闇瑕丒MF浜х敓鐨凪odel Code錛岄偅涔堥渶瑕佸涔犵殑涓滆タ灝辮繖涔堝浜嗐傚鏋滀綘榪橀渶瑕丒MF浜х敓鐨凟dit Code鍜孍ditor Code錛岄偅涔堣繕鏈夊彟澶栫殑鐭ヨ瘑闇瑕佸涔犮?br>

]]>