`
qq123zhz
  • 浏览: 534529 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

GEF 命令模式介绍

阅读更多

命令模式的结构如图:

在我们流程设计器中,实现复制粘贴功能,就是采用了命令模式,以剪切操作为例,当在编辑器中选中活动,在菜单中选择剪切,就会产生一个剪切命令(CutCommand对象)。

剪切操作所用到的类如下:

名称

说明

org.eclipse.gef.commands.Command

命令的抽象类

org.eclipse.gef.commands.Command.CompoundCommand

结合多个命令的命令的类

com.example.workflow.commands.CutCommand

剪切命令的类

com.example.workflow.model.WorkflowProcess

流程类

com.example.workflow.action.CutAction

剪切动作类

 

Command抽象类,这个类中有个execute()方法。

CompoundCommand表示结合多个命令的命令的类,此类继承了Command类,这个类的commandList属性是java.util.ArrayList类型,用来存放多个继承Command的对象,这个类在执行execute()方法时,会把commandList中所用命令的execute()方法按ArrayList中顺序执行一边,在执行undo()方法时,会把commandList中所用命令的undo ()方法按ArrayList中反序执行一边。

CutCommand类表示剪切活动命令,该类继承了Command类,该类有parentchild两个属性,parentWorkflowProcess对象,表示流程对象,childAbstractActivity对象,表示要剪切的活动对象,在构造函数中,给这两个属性赋值,指明要从哪个流程模型中删除哪个活动,在execute()方法中调用parentremoveChild()方法,把活动从流程模型中删除。

CutAction类是调用命令的类,这个类继承了org.eclipse.gef.ui.actions.SelectionAction,在这个类的run()方法中新建了CutCommandCompoundCommand对象,并且把CutCommand对象加入到CompoundCommand对象的commandList中,这样如果剪切多个活动,执行了多个CutCommand命令,但这些命令都放在commandList中,这样在用户开来,就是执行一个命令。

对照命令模式的结构图,CompoundCommandCutCommand就相当于ConcreteCommandWorkflowProcess相当于Reciever,removeChild()方法就是Recieveraction()方法,而CutAction则同时扮演了ClientInvoker角色。

CutCommand类代码:

package com.example.workflow.commands;

 

import org.eclipse.gef.commands.Command;

 

import com.example.workflow.model.AbstractActivity;

import com.example.workflow.model.WorkflowProcess;

 

public class CutCommand extends Command{

      

       private WorkflowProcess parent; 

       private AbstractActivity child;

      

       public CutCommand(WorkflowProcess parent,AbstractActivity child){

              super();

              if (parent == null || child == null) {

                     throw new IllegalArgumentException();

              }

              this.parent = parent;

              this.child = child;

              setLabel("cut activity");

       }

      

       public boolean canExecute() {

              return parent != null && child != null;

       }    

      

       public void execute() {         

              redo();

       }

 

       public void redo() {      

              parent.removeChild(child);   

       }

 

       public void undo() {

              parent.addChild(child);

       }           

 

}

CutAction类代码:

package com.example.workflow.action;

 

import java.util.List;

 

import org.eclipse.gef.EditPart;

import org.eclipse.gef.commands.Command;

import org.eclipse.gef.commands.CompoundCommand;

import org.eclipse.gef.ui.actions.Clipboard;

import org.eclipse.gef.ui.actions.SelectionAction;

import org.eclipse.jface.resource.ImageDescriptor;

import org.eclipse.ui.IWorkbenchPart;

import org.eclipse.ui.actions.ActionFactory;

 

import com.example.workflow.Activator;

import com.example.workflow.commands.CutCommand;

import com.example.workflow.model.AbstractActivity;

import com.example.workflow.model.WorkflowProcess;

import com.example.workflow.parts.WorkflowProcessEditPart;

 

public class CutAction extends SelectionAction{

      

       private List selectionList = null;

       private Clipboard clipboard = null;

       private WorkflowProcess workflowProcess;      

 

       public CutAction(IWorkbenchPart part) {

              super(part);

              setId(ActionFactory.CUT.getId());

              setText("Cut");             

              setImageDescriptor(ImageDescriptor.createFromFile(Activator.class, "icons/cut.gif"));

       }

      

       public Clipboard getClipboard() {

              return clipboard;

       }

      

       public void setClipboard(Clipboard clipboard) {

              this.clipboard = clipboard;

       }

             

       public WorkflowProcess getWorkflowProcess() {

              return workflowProcess;

       }

 

       public void setWorkflowProcess(WorkflowProcess workflowProcess) {

              this.workflowProcess = workflowProcess;

       }

 

       protected boolean calculateEnabled() {

              selectionList = super.getSelectedObjects();

              if(selectionList.isEmpty() ||

                            (selectionList.size() == 1 && selectionList.get(0) instanceof WorkflowProcessEditPart)){

                     return false;

              }

              return true;

       }

      

       public void run() {

              getClipboard().setContents(selectionList);

              execute(createCutCommand());

       }    

      

       private Command createCutCommand(){

              CompoundCommand compoundCmd = new CompoundCommand();

             

              for(int i=0;i<selectionList.size();i++){

                     EditPart part = (EditPart)selectionList.get(i);              

                     CutCommand cmd = new CutCommand(getWorkflowProcess(),(AbstractActivity)part.getModel());

                     compoundCmd.add(cmd);

              }

             

              return compoundCmd;

       }    

 

}

 

WorkflowProcess类代码:

 

package com.example.workflow.model;

 

import java.util.ArrayList;

import java.util.List;

 

/**

 * 流程模型,可以包含多个活动和转移模型

 * @author Administrator

 *

 */

public class WorkflowProcess extends ModelElement{      

      

       private static final long serialVersionUID = -5478693636480758659L;

       /** Property ID to use when a child is added to this WorkflowProcess. */

       public static final String CHILD_ADDED_PROP = "WorkflowProcess.ChildAdded";

       /** Property ID to use when a child is removed from this WorkflowProcess. */

       public static final String CHILD_REMOVED_PROP = "WorkflowProcess.ChildRemoved";    

       private List activities = new ArrayList();

      

       /**

        * Add a Activity to this WorkflowProcess.

        * @param s a non-null Activity instance

        * @return true, if the Activity was added, false otherwise

        */

       public boolean addChild(AbstractActivity a) {

              if (a != null && activities.add(a)) {

                     firePropertyChange(CHILD_ADDED_PROP, null, a);

                     return true;

              }

              return false;

       }

 

       /** Return a List of Activities in this WorkflowProcess. The returned List should not be modified. */

       public List getChildren() {

              return activities;

       }

      

       /**

        * Remove a Activity from this WorkflowProcess.

        * @param s a non-null Activity instance;

        * @return true, if the Activity was removed, false otherwise

        */

       public boolean removeChild(AbstractActivity a) {

              if (a != null && activities.remove(a)) {

                     firePropertyChange(CHILD_REMOVED_PROP, null, a);

                     return true;

              }

              return false;

       }

}

 

分享到:
评论

相关推荐

    GEF原理的详细介绍+程序实例和程序源码

    该框架的核心设计理念是基于MVC(Model-View-Controller)模式,它允许开发者将数据模型、视图呈现和用户交互逻辑有效地分离。 **EMF(Eclipse Modeling Framework)** 是GEF的紧密伙伴,它为构建和操作领域特定...

    GEF教程及demo源码GEF_RCP_DEMO.zip

    GEF使用命令模式来处理用户的编辑操作,每个编辑操作对应一个Command对象。当用户执行操作时,Command执行其doExecute()方法;如果需要撤销,调用undo()方法。 6. **适配器模式与EditPolicy** EditPolicy是GEF中...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    6. **命令系统**:介绍GEF的命令架构,允许撤销/重做操作,保持编辑历史的完整性。 7. **自定义编辑策略**:解释如何实现特定的编辑行为,如添加、删除和修改元素的规则。 8. **图元工厂**:学习如何使用MetaFactory...

    GEF 可用的6个demo

    5. **命令模式**:GEF使用命令模式来处理对模型的更改,确保操作可撤销/重做。DEMO将展示如何创建和执行命令,以及如何实现撤销/重做功能。 6. **手势和事件处理**:学习如何响应用户的鼠标和键盘输入,比如拖放...

    界面设计GEF应用实例

    最后,可能会介绍事件处理和命令模式的应用,这些都是GEF中实现撤销/重做功能的关键。 GEF的核心概念包括: 1. **模型-视图-控制器(MVC)**:GEF基于MVC设计模式,模型存储图形数据,视图负责显示,控制器处理...

    gef 转折线的相关方法实现和 GEF的API chm 格式

    - `org.eclipse.gef.commands.Command`:命令模式在GEF中用于执行可撤销/重做的操作,如添加、删除或修改图形元素。 - `org.eclipse.gef.requests.Request`:表示用户或系统对编辑域的某种请求,如创建新对象或选择...

    GEF 进阶+源码.rar

    5. **命令(Commands)**:GEF使用命令模式来处理用户的操作,每个图形编辑操作都对应一个命令对象,便于撤销/重做操作。 6. **手势( Gestures)**:手势处理用户输入,如鼠标点击、拖放等,将这些输入转化为图形...

    GEF 入门教程 中文版

    1. **定义剪切/复制命令**:使用GEF提供的命令模式来定义剪切/复制命令。 2. **定义粘贴命令**:同样使用命令模式定义粘贴命令。 3. **处理剪切板**:确保剪切板中的数据能够在不同操作之间正确传递。 #### 结论 ...

    GEF典型实现例子

    3. **命令(Commands)**:GEF使用可撤销/重做的命令系统来处理图形编辑操作,确保数据的正确性和一致性。 4. **手势(Gesture)**:定义了用户与图形界面的交互方式,如拖拽、点击等。 5. **图元工厂...

    GEF入门系列 pdf 格式资料

    - **Command和Transaction**:GEF使用命令模式来处理编辑操作,命令可以撤销和重做。同时,所有修改都封装在事务中,确保数据的一致性。 **2. GEF的架构** - **Zest图渲染引擎**:GEF通常与Zest结合使用,Zest是一...

    GEF 3.10 eclipse 插件

    6. **命令框架**:支持可撤销/重做的命令模式,确保用户操作的可逆性。 7. **图元选择**:提供了多种选择模式,包括单选、多选和矩形选择等。 8. **布局管理器**:提供了各种布局策略,如树状布局、网格布局等,可以...

    GEF 入门版中文教程 源码

    4. **命令(Command)**:GEF中的命令模式用于封装对模型的修改操作,使得撤销/重做功能得以实现。命令对象记录了更改前后的状态,便于执行回滚或重复操作。 5. **图元(Figure)**和**绘图(Drawing)**:GEF通过SWT...

    GEF理解系列三

    在GEF(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT...通过不断实践和调试,开发者可以熟练掌握GEF的各种策略和命令,从而构建出功能丰富的图形编辑工具。

    GEF-SDK-3.6.2 jar

    3. **手势和命令**:GEF支持多种用户手势(如拖拽、双击等)并将其转化为可执行的命令,这极大地增强了图形编辑器的交互性。 4. **连接器和容器**:GEF提供了处理图形元素之间连接以及包含关系的机制,如树形结构、...

    GEF-SDK-3.7.0

    1. **模型-视图-控制器(MVC)架构**:GEF遵循MVC设计模式,分离了数据模型、视图显示和用户交互控制,使得代码组织清晰,易于维护。 2. **图形绘制与布局**:GEF提供了一套图形绘制API,支持基本形状、连接线、...

    GEF中文教程+代码

    - **Step 8-9**:讲解命令模式的应用,实现可撤销/重做功能,并讨论如何处理模型变化的传播。 - **Step 10-11**:高级特性,如自定义编辑策略、图元工厂和工具栏的添加。 **4. 代码示例** 每个步骤的代码文件(gef....

    Eclipse的GEF学习

    GEF遵循经典的MVC(Model-View-Control)架构,这一设计模式使得模型、视图和控制器各司其职,减少了各组件间的耦合度,提高了系统的可维护性和灵活性。 #### 二、GEF的关键组件解析 1. **模型(Model)**:模型是...

    GEF.rarGEF.rar

    4. **命令(Command)模式**:GEF使用命令模式来处理用户操作,每个操作都被封装为一个命令对象,可以撤销或重做,提供了强大的编辑功能。 5. **适配器(Adapter)和观察者(Observer)模式**:适配器模式使得不同...

    GEF学习资料.zip

    6. **命令(Command)**:GEF采用命令模式来处理用户操作,每个命令代表一个可撤销/重做的操作,增强了编辑器的用户友好性。 **三、GEF的开发流程** 1. **定义模型**:首先,你需要定义自己的数据模型,这是编辑器...

    一个GEF的简单例子

    4. **Command(命令)**: GEF使用命令模式来实现对模型的修改。每个命令代表一个可逆的操作,确保用户可以撤销或重做他们的动作。 5. **ZOrder Manager(层序管理器)**: 确保图形元素在视图中的层次关系,以便正确...

Global site tag (gtag.js) - Google Analytics