ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式

一、Activit 源码的命令、责任链和模板模式类图

ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式_第1张图片

二、命令模式

Activiti以命令模式为基本开发形式,业务操作均封装为一个Command实现类。

Command 是基础的命令接口

ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式_第2张图片
CommandContext 命令上下文
该CommandContext的实例从Context获得,使用本地线程(ThreadLocal)保存(堆栈形式)

CommandExecutor 命令执行者
ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式_第3张图片
提供两种方法执行命令,传入CommandConfig(命令配置,方便扩展),也可以不传入。

ServiceImpl 命令调用者(即标准命令模式定义中的Client 客户端)
Activiti各个服务类,如TaskServiceImpl(任务服务)均继承ServiceImpl,
在该服务实现类中,构造各个Command的实现类,然后传给CommandExecutor进行执行。

三、责任链模式

CommandInterceptor 命令拦截器,采用命令模式实现的拦截器。作为责任链的“链节点”的定义。

ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式_第4张图片
除了如命令执行者CommandExecutor一样,也可以execute命令外,还提供了对链条的支持,
即getNext和setNext,获取和设置下一个链节点。

ProcessEngineConfigurationImpl 维护整条链的抽象类
在该流程引擎抽象实现类中,实现了对责任链的整条链条的维护。
在该类的initCommandInterceptors方法中,允许设置自定义前置、默认、后置和最后节点的命令拦截器。
代码如下图:
ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式_第5张图片
这样我们就可以通过在配置文件中配置前置、后置命令拦截器来进行我们自己的业务扩展了。

CommandInvoker 责任链“链节点”一个实现类,负责该链条最后节点的命令执行。
所以该类的getNext返回null,而且不支持setNext方法(抛出Unsupported异常)

四、模板模式

对Command的实现类中,有些命令采用了模板模式进行设计,方便对同类的一些方法进行代码重用。

比如NeedsActiveTaskCmd,如下图:

ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式_第6张图片
该类是抽象类,在execute方法中最后调用了execute(commandContext,task)方法(第一个箭头所示),
这个方法是抽象方法(第二个箭头所示),这个抽象方法由子类实现。
比如DelegateTaskCmd:

在这里插入图片描述

你可能感兴趣的:(工作流引擎,activiti,java)