GEF(Graphical Editor Framework)是一個圖形化編輯架構,它允許開發人員以圖形化的方式展示和編輯模型,從而提升使用者體驗。使用GEF可以方便的實現XML編輯器、UML類圖編輯器等應用程式。
EMF(Eclipse Modelling Framework)是Eclipse MDA(Model Driven Architecture)的重要組成部分,可以將模型轉換成高效的,正確的,易於定製的Java代碼。
基於GEF和EMF可以很方便地進行模型驅動開發(Model-Driven Development,MDD),本文在研究生畢業設計中,將GEF和EMF外掛程式結合起來,開發一個基於物件導向Petri網(一種Petri網,Petri網是描述非同步、並發的電腦系統模型的一種數學表示)的圖形化編輯器外掛程式。期間,接觸到了這兩個外掛程式中使用到的一些設計模式,和大家分享一下。
1. MVC
GEF使用MVC架構消除模型與視圖之間的耦合:
(1) Model: 可以用任何Java對象來表示,model必須擁有某種notification機制。
(2) View: Figure/TreeItems,在典型的GraphicalEditor中,Figure是用於在GraphicalViewer中顯示的Draw2D Figure,而TreeItems用於在Outline中的TreeViewer中顯示資訊。
(3) Controller: 通常對於每個Figure對應一個EditPart,EditPart用於控制模型與視圖,很多修改任務都是通過EditPolicy來實現的。
2. Command
GEF中的Command封裝了對模型Model的修改,可以通過繼承GEF中的抽象類別Command,提供可Redo/Undo功能,我們主要是在execute()/redo()/undo()中完成業務功能的實現。
3. Chain of Responsibility
Chain of Responsibility通過將Request傳遞給多個對象,並給這些對象機會處理請求,從而將請求的寄件者和接受者解除耦合。在GEF中,多個EditPolicy可以收到請求,返回Commands,這些Commands以鏈的方式組織在一起。
另外,以及EMF中的訊息分發機制。
4. State
允許Graphical Editor在內部狀態發生改變的時候,修改編輯器的行為。對於GEF Editor,使用者切換工具可以改變編輯器的狀態。例如,對於滑鼠按下事件,編輯器在啟用選區工具和啟用建立工具下的行為是截然不同的。詳細請見org.eclipse.gef.Tool介面,AbstractTool定義了幾個state,STATE_xxx.
5. Abstract Factory
GEF提供Interface建立一系列相關或相依賴的對象。這個模式在根據模型組件建立編輯組件時被使用。
GEF中根據EditPartFactory建立不同的EditPart,EMF中提供建立模型元素的工廠類ModelElementFactory。
6. Factory Method
定義了方法建立對象,但是允許子類決定執行個體化的類。這個模式沒有被單獨討論,但是它是建立編輯組件的另一種可選的方法。createChild方法允許你不使用工廠就建立子編輯組件。
7. Adapter
GEF的控制器EditPart中的getAdapter(Class key)方法。
EMF的Notifier-Adapter機制。
8. Singleton
Eclipse外掛程式工程的Single plugin instance類AbstractUIPlugin,保證外掛程式運行後只被執行個體化一次。
9. Composite
GEF中的各個顯示圖元composite之間以組合關係存在。
EMF中複合模型與子模型之間也以組合關係關在。
10. Observer
GEF中EditPart作為觀察者被註冊到EMF的模型對象中,監測模型的變化並通知視圖進行更新。
總結
通過大量使用設計模式,達到GEF和EMF外掛程式的靈活性和擴充性,便於開發。