论坛首页 Java企业应用论坛

EMF开发指南之Command Framework

浏览 4359 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-25  
★emf的command framework分为两部分,一部分是common的不依赖于emf.edit的command,另一个部分是和emf.edit关联的command,和emf.edit关联的command,通过EObject的相关方法来实现对model的attribute设置,reference修改,copy&paste操作等。
★在command command中,提供了一个Command接口,里面的方法包括execute(), undo(),redo(),canExecute(), canUndo()等等。其中getResult()方法的作用一般是用来告诉后续的command,当前操作的结果,这个在组合command中会用到,而getAffectedObject()方法则用来取得受execute(), redo(), undo()方法影响的对象,这个方法通常在emf.edit的ui framework中使用,比如一个属性被修改之后,其他受影响的属性也响应发生修改了,则ui对被修改的属性使用不同的颜色来加以标识(比如高亮),则两个方法返回的结果有时候会是一样的。
★从Command继承而来的AbstractCommand做的一件非常重要的事情就是实现了canExecute()方法,同时让从AbstractCommand继承的子类去实现prepare()方法来决定是否可执行,从而保证canExecute()最终只会被执行一次prepare()来做判断command是否能执行
★CommandStack主要在undo,redo的时候使用,它使用一个stack来维护所有可undoable的command,可以给commandstack添加一个CommandStackListener,那么stack中的所有command在被调用的时候都会出发该listener。BasicCommandStack是CommandStack的一个简单实现
★CompoundCommand用来一次执行多个command,它提供了一些特殊的操作,比如appendAndExecute(),该方法可以很好的将已执行的command加以记录下来,这样我们在undo的时候,直接倒过来执行commandlist中的每一个command即可,实际上其他的command也会在execute()方法里面这么干,另外一个方法就是unwrap(),如果你的compound command只有一个command的时候,该方法会起到一定的优化作用。
★Set,Add,Remove,Move,Replace以及CopyCommand都是和emf.edit关联的基本command,不过CopyCommand实际上是一个Compound Command,它结合了CreateCopyCommand和InitinalizeCopyCommand。对这些基本command加以组合便可以形成其他更高级的command,比如CreateChildCommand(AddCommand+SetCommand),CutToClipboardCommand(RemoveCommand),PasteFromClipboardCommand(AddCommand+CopyCommand),DragAndDropCommand(CopyCommand+RemoveCommand+AddCommand)等等。
★AbstractOverrideableCommand解决了一个代理的问题,不过还没明白有什么用 
★CommandParameter用来封装创建command所需要的参数,通过参看EditingDomain的createCommand方法实现我们可以得知,通过反射得到要创建的Command Class,接着根据约定:每一种Command必须提供相应的静态创建方法create来生成对应的Command实例
★model如何显示交给Label Provider来管理,而对model的维护则交给了EditingDomain,该实现主要做三件事:创建command,维护undo command stack,对编辑的resource提供访问接口。
★IEditingDomainItemProvider是用来访问model的层次关系的接口(Editing Domain也实现了这些方法,因此后者会调用前者的实现)。而IEditingDomainItemProvider的实现则是通过ItemProvider来取得
★ItemProviderAdapter也提供了一个根据editing domain, commandparameter创建command的createCommand()方法。它和AdapterFactoryEditingDomain的实现基本一样。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics