本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
Activiti的设计模式
本文要点
命令模式和责任链模式,以及Activiti如何使用这两种模式
Activiti的命令拦截器
Activiti提供了命令拦截器的功能,外界对Activiti流程中各个实例进行操作,实际可以看作是对数据进行相应的操作,在此过程中,Activiti使用了设计模式中的命令模式,每一个操作数据库的过程,均可被看作为一个命令,然后交由命令执行者去完成。除此之外,为了能让使用者可以对这些命令进行相应的拦截(进行个性化处理),Activiti还使用了设计模式中的责任链模式,使用者可以添加相应的拦截器(责任链模式中的处理者)。为了让读者对这些知识有更深入的了解,在本小节,将先讲解命令模式与责任链模式。
注:对于初学者,可跳过本小节,掌握前面的流程引擎配置即可。
命令模式
在GoF的设计模式中,命令模式属于行为型模式,它把一个请求或者操作封装到命令对象中,这些请求或者操作内容包括接收者信息,然后将该命令对象交由执行者执行,执行者不需要关心命令的接收人或者命令的具体内容,因为这些信息均被封装到命令对象中。命令模式中涉及的角色以及其作用如下:
命令接口(Command):声明执行操作的接口。
接口实现(ConcreteCommand):命令接口实现,需要保存接收者的相应操作,并执行相应的操作。
命令执行者(Invoker):要求命令执行此次请求。
命令接收人(Receiver):由命令的实现维护实例,并在命令执行时处理相应的任务。
接下来,编写一个最简单的命令模式。代码清单4-19为命令接口。
代码清单4-19:codes\04\4.5\gof-command\src\org\crazyit\activiti\Command.java
public interface Command {
/**
*执行命令,参数为命令接收人
* @param receiver
*/
void execute(CommandReceiver receiver);
}
然后创建命令接收者,请看代码清单4-20。
代码清单4-20:codes\04\4.5\gof-command\src\org\crazyit\activiti\CommandReceiver.java
public interface CommandReceiver {
//命令执行者方法A
void doSomethingA();
//命令执行者方法B
void doSomethingB();
}
本例中命令接者只有一个实现,方法A(doSomething)打印“命令接收人执行命令A”,方法B(doSomethingB)打印“命令接收人执行命令B”,接下来创建命令执行者,如代码清单4-21所示。
代码清单4-21:codes\04\4.5\gof-command\src\org\crazyit\activiti\CommandExecutor.java
public class CommandExecutor {
public void execute(Command command) {
//创建命令接者可以使用其他设计模式
command.execute(new CommandReceiverImpl());
}
}
注意命令执行者的实现中,调使用命令的execute方法,并将相应的命令接收人设置到命令的execute方法参数中。此处创建命令接收者的方式,可以使用其他的设计模式完成,例如工厂模式,单态模式等等,此处为了更加简单,直接new一个CommandReceiver的实现类。接下