`

[zt]EMF.Edit编程学习笔记之二: Command框架

阅读更多
FROM:http://www.blogjava.net/eclipshine/archive/2005/07/29/8763.html
(注:大部分翻译,整理自Eclipse Modeling Framework: A Developer's Guide一书的第3.3, 3.4节的内容)

EMF
Command框架分为两个部分,Common Command FrameworkEMF.EditCommandsCommon Command Framework定义了基本的Command接口并提供了一些基本的类,例如CommandStack, CompoundCommand等。这个Command框架是非常通用的,并不依赖于EMF.Edit,甚至也不依赖于EMF,是完全独立的一个框架。而EMF.EditCommands,则是专门用来编辑EObjects的。
 
Command接口是所有Command必须实现的基本接口。包括了execute(),undo(), redo()等方法。Command在执行先会先进行测试,执行canExecute()判断其能否被执行。canUndo()被用来检查一个Command是否能被undo(),它返回false也就意味着redo()和undo()没有被实现。Command接口的getResult()和getAffectedObjects()方法是可选的,但是有时候非常有用。getResult()可以用来返回一个执行的结果对象,而getAffertedObjects()方法则可以用来返回在执行的过程中被修改过的对象。通常getAffertedObjects()可以和getResult返回相同的对象,但也并不总是如此。
 
AbstractCommand提供对Command接口的缺省实现。唯一重要的实现是canExecute()方法,将控制流转交给另一个钩子方法prepare()。然而prepare()只被执行一次,而不论canExecute()被执行多少次,这个特性在某些情况下可以避免大量的计算被重复执行。
java 代码
  1. public boolean canExecute() {   
  2.  if (!isPrepared) {   
  3.     isExecutable = prepare();   
  4.     isPrepared = true;   
  5.  }   
  6.  return isExecutable;   
  7. }   
 
CommandStack接口定义了一个Command栈,使用后进先出的方式保存所有执行过的Command,使得undo()和redo()能够被方便的实现。BasicCommandStack是CommandStack接口的一个简单实现。
 
CompoundCommand是一个很有用的类。可以让你通过基本的Command对象来组合更为复杂的高层次的Command。它的execute()方法会依次调用每一个成员Command;而canExecute()等测试方法在当所有成员Command的canExecute()方法返回为true是方返回true。一个有用的技巧是使用appendAndExecute()来加入并立即执行一个Command;使用这个方法可以记录一个命令执行的序列,并一次性的进行undo()。
 
EMF.Edit Commands在Common Command Framework的基础上,执行专门正对于EObject的命令。它定义了如下的几个基本Command:
1.       SetCommand:用来为EObject的attribute或者reference设置值。
2.       AddCommand:用来为EObject的multiplicity为many的feature添加一个或者多个值。
3.       RemoveCommand:则是用来做和AddCommand相反的事情。
4.       MoveCommand:用来移动对象在multiplicitymanyfeature中的位置。
5.       ReplaceCommand:用来替换一个multiplicity为many的feature中的对象。
6.       CopyCommand:执行EObject对象的深度拷贝(Clone).
除了CopyCommand之外,其他的Command均为简单命令,而CopyCommand命令则是由CreateCopyCommand和InitializeCopyCommand这两个命令组合而成。
 
除了上述的基本命令之外,EMF.Edit基于基本命令的,执行High Level编辑功能的命令:
1.       CreateChildCommand。
2.       CutToClipboardCommand。
3.       CopyToClipboardCommand。
4.       PasteFromClipboardCommand。
5.       DragAndDropCommand。
 
AbstractOverrideableCommand作为EMF.Edit的Command的抽象基类,上面大部分的命令均继承于它,而AbstractOverrideableCommand则是继承于AbstractCommand。它提供了扩展机制来覆盖其自生的execute()方法:
java 代码
  1. public final void execute() {   
  2.  if (overrideCommand != null)   
  3.     overrideCommand.execute();   
  4.  else  
  5.     doExecute();   
  6. }   
之所以这样做的,而不是直接使用继承来扩展Command原因,是因为你可以使用Common Command来实现模型相关而与EMF无关的Command,来扩展这些专门针对于EMF EObjects的命令。从上面的代码也可以看出,如果要用继承来覆盖已有的命令的话,应该覆盖doExecute()方法而不是execute()方法。
 
通常,Command都是由EditingDomain接口的createCommand(Class commandClass,  CommandParameter commandParameter)来创建的,它接受通用的CommandParater参数,来创建Command。但是,为了方便起见,每一个EMF.Edit Command都提供了static的create()方法来创建相应的对象,而由它在来调用EditingDomain的createCommand()。
 
EditingDomain需要完成三种功能:
1.       创建commands,在AdapterFactoryEditingDomain中这是通过代理到一个Item Provider来实现的。
2.       管理Command Undo栈,通过CommandStack来实现。
3.       提供方法来访问EMF模型对象的ResourceSet,以及load或者save Resource。
 
创建一个对象,一般来说使用的是Command的静态create()方法。例如对于RemoveCommand来说,可以通过如下的代码来创建一个RemoveCommand:
java 代码
  1. Command cmd = RemoveCommand.create(editingDomain,   
  2.                                  aPurchaseOrder,   
  3.                                  poPackage.getPurchaseOrder_Items(),   
  4.                                  aItem);  
 
在EditingDomain的ResourceSet之间存在有双向的关联。因为一个对象知道其Resource,而Resource又知道其ResourceSet,因此,由一个对象可以得到其EditingDomain,而EditingDomain又提供了创建Command的方法,因此一个对象可以在任何地方都能够创建修改这个对象的Command了,如下例所示:
java 代码
  1. EditingDomain editingDomain = getEditingDomain(object);   
  2. editingDomain.getCommandStack().execute(   
  3.  SetCommand.create(editingDomain, object, feature, value));  
分享到:
评论

相关推荐

    eclipse的emf插件

    - **plugins**:此目录可能包含了多个Eclipse插件,EMF插件可能就是其中之一,每个插件都是一个独立的JAR文件,用于扩展Eclipse的功能。 - **binary**:可能包含的是编译后的二进制代码,用于EMF插件的运行。 - **...

    org.eclipse.emf.ant_2.1.0.jar

    org.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jar

    EMF模型文件对比/比较(emf.compare)

    EMF(Eclipse Modeling Framework)模型文件对比/比较(emf.compare)是针对基于EMF构建的模型文件进行差异分析的工具。...要获取更详细的信息,你需要访问提供的博客链接或寻找其他资源来深入学习EMF.compare的使用。

    org.eclipse.emf.transaction-1.8.0.201405281451.jar

    解决4.7.2版本eclipse不能在线安装activiti插件的问题

    eclipse Activiti 流程图创建缺少 emf jar

    requires 'org.eclipse.emf.transaction 1.4.0' but it could not be found 解决办法:将下载解压后的这三个文件拷贝到eclipse的plugin文件夹下即可解决上述问题 org.eclipse.emf.transaction_1.4.0.v201003 31-1738...

    requires 'org.eclipse.emf.transaction 1.4.0' but it could not be found 问题处理

    eclipse安装Activiti Designer 5.14.1插件失败后,把这上述压缩包中的jar文件拷贝到自己的eclipse的plugin文件夹下面,重启eclipse再次安装activiti插件就可以了。

    EMF.rar_site:www.pudn.com

    EMF(Eclipse Modeling Framework)是Eclipse基金会开发的一个开源框架,用于构建基于模型的应用程序。这个框架基于Java,提供了一套完整的工具和技术,用于创建、操作和利用复杂的模型。EMF是Eclipse IDE中的核心...

    emf.rar_SPI delphi_delphi emf_delphi spi_emf delphi_spi

    标题中的"emf.rar_SPI delphi_delphi emf_delphi spi_emf delphi_spi"关键词表明,这个压缩包文件涉及到Delphi编程语言、SPI(Service Provider Interface)接口以及EMF(Enhanced Metafile)图形格式的转换。...

    eclipse-emf for activiti 插件 jar包

    org.eclipse.emf.transaction_1.4.0.v20100331-1738.jar org.eclipse.emf.validation_1.7.0.201306111341.jar org.eclipse.emf.workspace_1.5.1.v20120328-0001.jar

    emf.rar_EMF文件_arrangekrk_增强图元_增强型图元

    在压缩包中的"emf.hlp"文件,很可能是一个帮助文件,提供了关于EMF格式或者"arrangekrk"工具的详细指南和使用信息。帮助文件通常以.HLP格式存在,它们包含有用户界面、功能介绍和问题解决等内容,以辅助用户理解和...

    org.eclipse.emf.validation-1.7.0.201306111341.jar

    Activiti2.0安装所需插件

    emwin emf.zip

    【标题】"emwin emf.zip" 是一个包含多种实用工具的压缩文件,主要软件有ffmpeg和JPEG2Movie。这两个工具在IT行业中都是处理多媒体数据的重要软件,尤其在图像和视频处理方面扮演着不可或缺的角色。 **ffmpeg** ...

    Eclipse插件开发学习笔记全篇+源码.rar

    本文将深入探讨Eclipse插件开发的相关知识点,结合提供的"全书分为4篇共24章"的学习笔记和源码,帮助你更全面地理解和实践Eclipse插件开发。 第一篇:基础篇 在这一篇中,你将学习到Eclipse插件开发的基础知识,...

    将EMF图片格式转换成PNG

    BufferedImage image = new BufferedImage(emf.getWidth(), emf.getHeight(), BufferedImage.TYPE_INT_ARGB); // 将EMF渲染到BufferedImage上 Graphics2D g2d = image.createGraphics(); g2d.drawRenderedImage...

    EMF.rar_emf

    **EMF(Eclipse Modeling Framework)详解** EMF(Eclipse Modeling Framework)是Eclipse基金会下的一个...通过EMF.docx文档的学习,你可以更深入地了解EMF的工作原理和实际应用,为你的编程生涯添加一项强大的工具。

    linux虚拟机终端ls文件名颜色规则

    35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa...

    org.eclipse.emf.validation_1.8.0.201405281429.jar

    实际测试,有效,实际测试,有效,

    org.eclipse.emf.workspace-1.5.2.202208110935.jar

    org.eclipse.emf.workspace_1.5.2.202208110935.jar

    org.eclipse.emf.validation-1.8.1.202208271102.jar

    org.eclipse.emf.validation_1.8.1.202208271102.jar

Global site tag (gtag.js) - Google Analytics