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

2014-11-12 10:38:20

请关注唯心的个人微信公众号:craft6-cn(中划线,也可以搜索:领域驱动业务建模)

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

Activit 源码的命令模式 & 责任链模式(Craft6.cn 颜超敏).jpg

二、命令模式

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

  • Command 是基础的命令接口

    只定义了一个方法,根据命令上下文执行,并返回范型。
    command_java.jpg


  • CommandContext 命令上下文

    该CommandContext的实例从Context获得,使用本地线程(ThreadLocal)保存(堆栈形式)


  • CommandExecutor 命令执行者
    command_executor.jpg

    提供两种方法执行命令,传入CommandConfig(命令配置,方便扩展),也可以不传入。


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

三、责任链模式

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

    除了如命令执行者CommandExecutor一样,也可以execute命令外,还提供了对链条的支持,
    即getNext和setNext,获取和设置下一个链节点。


  • ProcessEngineConfigurationImpl 维护整条链的抽象类
    在该流程引擎抽象实现类中,实现了对责任链的整条链条的维护。
    在该类的initCommandInterceptors方法中,允许设置自定义前置、默认、后置和最后节点的命令拦截器。
    代码如下图:
    process.jpg

    这样我们就可以通过在配置文件中配置前置、后置命令拦截器来进行我们自己的业务扩展了。

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

四、模板模式

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


  • 比如NeedsActiveTaskCmd,如下图:
    NeedsActiveTaskCmd.jpg

    该类是抽象类,在execute方法中最后调用了execute(commandContext,task)方法(第一个箭头所示),
    这个方法是抽象方法(第二个箭头所示),这个抽象方法由子类实现。
    比如DelegateTaskCmd:
    DelegateTaskCmd.jpg


可通过扫描左侧二维码阅读本文。本站文章均为颜超敏原创,欢迎转载,请注明出处即可,转载可通过下面的社会化工具快速完成。

分享到:


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

Activiti设计模式,命令模式,责任链模式,模板模式。

本文阐述了Activiti源码中采用的命令模式、责任链模式和模板模式。

并通过类图、代码进行详细说明。


颜超敏,唯心六艺,Craft6.cn,电子商务博客,电子商务研发,电商研发,电子商务研究,电商研究,电子商务专家,电商专家,电子商务知识,电商知识,电子商务教程,电商教程,电子商务模式,电子商务平台,电子商务商业模式,电子商务数据库设计,电商数据库设计,电子商务系统分析,Java架构设计,Java软件架构,B2C,O2O,o2o模式,o2o电子商务,o2o电子商务平台,中国电子商务,电子商务平台建设方案
粤ICP备14060523号 Copyright @2014 -唯心六艺软件