Eclipse中GEF和EMF插件设计模式总结

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插件的灵活性和扩展性,便于开发。

posted on 2011-08-14 12:17  大圆那些事  阅读(3942)  评论(0编辑  收藏  举报

导航