模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。
在activit中很多地方用到了此模式,用这个模式可以重用业务逻辑。
实例代码如下:
比如在ACTIVITI 的设置流程变量代码就采用了此模式。
1.抽象模板类。
public abstract class NeedsActiveExecutionCmdimplements Command , Serializable { private static final long serialVersionUID = 1L; protected String executionId; public NeedsActiveExecutionCmd(String executionId) { this.executionId = executionId; } public T execute(CommandContext commandContext) { if(executionId == null) { throw new ActivitiIllegalArgumentException("executionId is null"); } ExecutionEntity execution = commandContext .getExecutionEntityManager() .findExecutionById(executionId); if (execution==null) { throw new ActivitiObjectNotFoundException("execution "+executionId+" doesn't exist", Execution.class); } if (execution.isSuspended()) { throw new ActivitiException(getSuspendedExceptionMessage()); } return execute(commandContext, execution); } /** * Subclasses should implement this method. * The provided { @link ExecutionEntity} is guaranteed to be active (ie. not suspended). */ protected abstract T execute(CommandContext commandContext, ExecutionEntity execution);
这个代码可以被其他的子类继承,这个类实现了根据executionId获取ExecutionEntity 实例逻辑,其他的子类可以继承这个类,实现 T execute(CommandContext commandContext, ExecutionEntity execution)方法。重用这此逻辑。
子类代码如下:
public class SetExecutionVariablesCmd extends NeedsActiveExecutionCmd
protected Object execute(CommandContext commandContext, ExecutionEntity execution) 这个代码就是子类实现的逻辑。