`
iamzhongyong
  • 浏览: 806434 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Activiti中的命令模式解析

    博客分类:
  • java
 
阅读更多

最近在看Activiti的源代码,发现是基于命令模式进行的开发,所以对于Command模式做了个了解。

什么是命令模式?

这个随便翻开一本模式的书,都有介绍,这里就不再冗余了。画一个Command的图,然后加一个例子吧,方法和类的命名加入了自己的理解。

1、模式的根本是把“行为的请求者”和“行为的处理者”分开,实现解耦;

2、实现Command的ConcreteCommand,有时候要跟进实际情况保存额外的状态信息,例如上下文等;

3、大多数请求响应的处理,可以使用Command模式来扩展;

4、缺点的话,就是如果涉及的命令很多的话,本来简单的命令几行代码的事情,但是利用了这个模式之后,就需要搞一个类去做了;

 

 

1
2
3
4
5
//需要执行的命令都在这里
public interface Command  {
    //命令的执行方法
    public void execute( ) ;   
}

 

1
2
3
4
5
6
7
8
9
10
11
public class ConcreteCommand implements Command{
    private CommandProcess receiver;   
    @Override
    public void execute() {
        this.receiver.doSomething();
    }
    public ConcreteCommand(CommandProcess receiver) {
        super();
        this.receiver = receiver;
    }  
}

 

1
2
3
4
5
6
7
8
9
10
//调用命令
public class CommandInvoker {  
    private Command command;       
    public void action(){
        command.execute();
    }
    public void setCommand(Command command) {
        this.command = command;
    }      
}

 

1
2
3
4
5
//命令的执行者
public interface CommandProcess {
 
    public String doSomething();
}

 

1
2
3
4
5
6
7
8
9
public class CommandProcessForWindows implements CommandProcess {
 
    @Override
    public String doSomething() {
        System.out.println("ReceiverCmdForWindows doSomething ");
        return "iamzhongyong windows";
    }
 
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
 
    public static void main(String[] args) {
        CommandInvoker invoker = new CommandInvoker();
 
        //确定命令的处理者,构建命令
        CommandProcess process = new CommandProcessForWindows();       
        Command command = new ConcreteCommand(process);
 
        invoker.setCommand(command);
        invoker.action();
    }
}

 

Activiti中的命令模式是咋样的?

看了源代码,发现应该是Command模式和责任链模式的结合,执行命令的之后,加入了迭代的成分在里面。

 

 

Command类,这个和标准的Command模式不同之处,就是execute方法中增加了CommandContext信息,这个类可以说是执行命令的上下文

1
2
3
4
5
public interface Command <T> {
 
  T execute(CommandContext commandContext);
 
}

 

ServiceImpl类,所有的服务类继承这个,其实就一个作用,持有CommandExecutor类,这个类是命令的请求者

1
2
3
4
5
6
7
8
9
10
11
12
public class ServiceImpl {
 
  protected CommandExecutor commandExecutor;
 
  public CommandExecutor getCommandExecutor() {
    return commandExecutor;
  }
 
  public void setCommandExecutor(CommandExecutor commandExecutor) {
    this.commandExecutor = commandExecutor;
  }
}

 

CommandExecutor这个是命令的执行,其中CommandConfig是命令的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface CommandExecutor {
 
  /**
   * @return the default {@link CommandConfig}, used if none is provided.
   */
  CommandConfig getDefaultConfig();
 
  /**
   * Execute a command with the specified {@link CommandConfig}.
   */
  <T> T execute(CommandConfig config, Command<T> command);
 
  /**
   * Execute a command with the default {@link CommandConfig}.
   */
  <T> T execute(Command<T> command);
 
}

 

这个是一个具体命令类,内部含义可以不用看,就是一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * @author Joram Barrez
 */
public class DeleteDeploymentCmd implements Command<Void>, Serializable {
 
  private static final long serialVersionUID = 1L;
  protected String deploymentId;
  protected boolean cascade;
 
  public DeleteDeploymentCmd(String deploymentId, boolean cascade) {
    this.deploymentId = deploymentId;
    this.cascade = cascade;
  }
 
  public Void execute(CommandContext commandContext) {
    if(deploymentId == null) {
      throw new ActivitiIllegalArgumentException("deploymentId is null");
    }
 
    // Remove process definitions from cache:
    Context
      .getProcessEngineConfiguration()
      .getDeploymentManager()
      .removeDeployment(deploymentId, cascade);
 
    return null;
  }
}

 

CommandExecutor在啥时候初始化?

在ProcessEngineConfigurationImpl中有个init方法,里面有对于executor和intecerptor的初始化。

 

CommandExecutorImpl 这个是一个基本的实现,没有迭代的东西在里面,CommandInterceptor这个和CommmandExecutor一样的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class CommandExecutorImpl implements CommandExecutor {
 
  private final CommandConfig defaultConfig;
  private final CommandInterceptor first;
 
  public CommandExecutorImpl(CommandConfig defaultConfig, CommandInterceptor first) {
    this.defaultConfig = defaultConfig;
    this.first = first;
  }
 
  public CommandInterceptor getFirst() {
    return first;
  }
 
  @Override
  public CommandConfig getDefaultConfig() {
    return defaultConfig;
  }
 
  @Override
  public <T> T execute(Command<T> command) {
    return execute(defaultConfig, command);
  }
 
  @Override
  public <T> T execute(CommandConfig config, Command<T> command) {
    return first.execute(config, command);
  }
 
}

 

CommandInterceptor拦截类,有多个实现,这里是串接命令模式和责任链模式的衔接点

1
2
3
4
5
6
7
8
9
public interface CommandInterceptor {
 
  <T> T execute(CommandConfig config, Command<T> command);
 
  CommandInterceptor getNext();
 
  void setNext(CommandInterceptor next);
 
}

 

分享到:
评论

相关推荐

    Activiti命令拦截器和设计模式.docx

    命令模式的特性在 Activiti 中的体现: 1. 将命令进行封装——Activiti 封装成了 Command 对象; 2. 命令发出者和执行者分离——Activiti 将任务委托给 CommandInterceptor 来执行,而不是直接让 CommandExecutor ...

    activiti中文api(用户手册)

    1. 流程引擎:这是Activiti的核心,负责解析流程定义文件,执行流程实例,并处理流程中的事件。例如,`RuntimeService`接口用于启动新的流程实例,而`ProcessEngine`是与流程引擎交互的主要入口点。 2. 流程定义:`...

    activiti中文文档

    activiti中文文档

    activiti6.0 中文api

    Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级应用中,提供流程定义、执行、监控等全面的功能。在Activiti 6.0版本中,它引入了更多的改进和新特性,以提升性能和易用性。中文API文档是针对中国...

    Activiti-5.4中实现会签

    在企业级应用开发中,流程管理是一个至关重要的部分,它涉及到任务分配、审批流程和协作等多个环节。Activiti 是一个非常流行的...同时,掌握抽象类和接口的概念有助于理解Activiti框架的设计模式和组件间的交互方式。

    Activiti-activiti-5.22.0 源码

    源码中可以查看 Activiti 如何解析 BPMN 图形并将其转化为可执行的任务。 2. **流程实例和任务管理**:在 Activiti 中,每个流程定义创建一个流程实例,而实例中的每个步骤则表示一个任务。源码中可以研究流程实例...

    activitidemo代码详解,全面注释,开发利器

    activitidemo代码详解,全面注释,开发利器activitidemo代码详解,全面注释,开发利器activitidemo代码详解,全面注释,开发利器activitidemo代码详解,全面注释,开发利器activitidemo代码详解,全面注释,开发利器...

    Activiti中文手册

    部署业务文档是 Activiti 的一个重要特性,用于将流程定义部署到 Activiti 引擎中。 REST API Activiti 的 REST API 提供了强大的流程管理和自动化功能,包括: * 通用 Activiti REST 原则 * 安装与认证 * 方法...

    activiti表结构详解

    本篇文章将详细解析Activiti的表结构,并结合提供的erm模型文件和sql脚本进行阐述。 首先,我们来看`activiti.erm`文件,这是一个实体关系模型(Entity Relationship Model)文件,它直观地展示了Activiti数据库中...

    activiti核心接口详解

    Activiti核心接口详解 Activiti 是一个开源的业务流程管理系统,提供了强大的流程引擎和相关接口。在本节中,我们将详细介绍 Activiti 中的核心接口,包括 ProcessEngineConfiguration、ProcessEngines 等。 1. ...

    activiti工作流中文说明文档

    如果您在使用Activiti过程中遇到任何问题,可以在用户论坛上进行提问和评论,或者在JIRA问题跟踪系统中创建问题。但是,请不要将问题提交到GitHub的问题跟踪系统上。 注意事项 -------- * 试验性功能标记着...

    activiti5.21中文手册

    《Activiti 5.21 中文手册》是专为初学者设计的一份详尽参考资料,旨在帮助读者快速掌握 ...通过阅读和实践手册中的内容,你可以有效地掌握 Activiti 的核心功能,从而在实际项目中发挥出其强大的工作流管理能力。

    Activiti6 中文 用户指南 操作手册 开发API

    - **Activiti设置**:安装JDK,设置环境变量,导入Activiti库到项目中。 - **数据库设置**:配置数据库以存储流程实例和相关数据,通常使用MySQL、Oracle等关系型数据库。 - **包含Activiti jar及其依赖项**:在...

    Activiti-5.21数据库表结构详解(共25张表)

    Activiti-5.21数据库表结构详解(共25张表) 工作流的应用越来越广泛,而activiti是公认的现阶段最好的工作流框架之一,详细了解activiti的库表结构有助于您更好的掌握学习工作流框架,共享本资源以供广大编程从业人员...

    activiti,入门详解

    【Activiti工作流入门详解】 Activiti是一款开源的工作流程引擎,它基于模型驱动的架构,提供了高度可扩展性和灵活性,广泛应用于企业的业务流程自动化。在本文中,我们将深入理解如何入门Activiti,包括配置安装、...

    Activiti 5 用户手册 中文

    Activiti 是一个开源的工作流引擎,它主要用于自动化业务流程,特别是在企业级应用中。这个"Activiti 5 用户手册 中文"提供了全面的指南,帮助用户理解和操作Activiti 5版本的各项功能。以下是对手册中关键知识点的...

    activiti 中文用户手册

    在 Activiti 的中文用户手册中,你将找到以下关键知识点: 1. **Activiti简介**:了解Activiti的基本概念,包括其设计理念、架构和主要特性。Activiti不仅支持BPMN 2.0标准,还提供了一个直观的流程设计器,使得...

    activiti中文手册5.21

    Activiti是基于Java的开源业务流程管理(BPM)和工作流系统,它在企业级应用中广泛使用,尤其在自动化业务流程、提高效率和协作方面表现出色。 手册的描述提示我们,解压后的文件包含了丰富的图文信息,用户可以...

    Activiti 中文API 和 Activiti 表结构文档说明

    Activiti是一款开源的工作流引擎,它为业务流程自动化提供了强大的支持。这个文档集包含了中文API说明和Activiti的表结构文档,旨在帮助开发者更高效地理解和使用Activiti进行流程设计和实现。 一、Activiti API ...

    Activiti6.x中文用户指南 html

    1. **简介**:这部分介绍了Activiti的基本概念,包括工作流引擎的工作原理、Activiti6.x的主要功能和它在企业应用中的价值。此外,还会有对Activiti历史版本的简要回顾,以及新版本6.x的改进之处。 2. **安装与配置...

Global site tag (gtag.js) - Google Analytics