ACTIVITI 研究系列 —— 源码研究之命令、责任链和模板模式
一、Activit 源码的命令、责任链和模板模式类图
二、命令模式
Activiti以命令模式为基本开发形式,业务操作均封装为一个Command实现类。
Command 是基础的命令接口
CommandContext 命令上下文
该CommandContext的实例从Context获得,使用本地线程(ThreadLocal)保存(堆栈形式)
CommandExecutor 命令执行者
提供两种方法执行命令,传入CommandConfig(命令配置,方便扩展),也可以不传入。
ServiceImpl 命令调用者(即标准命令模式定义中的Client 客户端)
Activiti各个服务类,如TaskServiceImpl(任务服务)均继承ServiceImpl,
在该服务实现类中,构造各个Command的实现类,然后传给CommandExecutor进行执行。
三、责任链模式
CommandInterceptor 命令拦截器,采用命令模式实现的拦截器。作为责任链的“链节点”的定义。
除了如命令执行者CommandExecutor一样,也可以execute命令外,还提供了对链条的支持,
即getNext和setNext,获取和设置下一个链节点。
ProcessEngineConfigurationImpl 维护整条链的抽象类
在该流程引擎抽象实现类中,实现了对责任链的整条链条的维护。
在该类的initCommandInterceptors方法中,允许设置自定义前置、默认、后置和最后节点的命令拦截器。
代码如下图:
这样我们就可以通过在配置文件中配置前置、后置命令拦截器来进行我们自己的业务扩展了。
CommandInvoker 责任链“链节点”一个实现类,负责该链条最后节点的命令执行。
所以该类的getNext返回null,而且不支持setNext方法(抛出Unsupported异常)
四、模板模式
对Command的实现类中,有些命令采用了模板模式进行设计,方便对同类的一些方法进行代码重用。
比如NeedsActiveTaskCmd,如下图:
该类是抽象类,在execute方法中最后调用了execute(commandContext,task)方法(第一个箭头所示),
这个方法是抽象方法(第二个箭头所示),这个抽象方法由子类实现。
比如DelegateTaskCmd: