ACTIVITI 研究代码 之 模版模式

模板方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。

在activit中很多地方用到了此模式,用这个模式可以重用业务逻辑。

实例代码如下:

比如在ACTIVITI 的设置流程变量代码就采用了此模式。

1.抽象模板类。

public abstract class NeedsActiveExecutionCmd<T> implements Command<T>, 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<Object> {



  private static final long serialVersionUID = 1L;

  

  protected Map<String, ? extends Object> variables;

  protected boolean isLocal;

  

  public SetExecutionVariablesCmd(String executionId, Map<String, ? extends Object> variables, boolean isLocal) {

    super(executionId);

    this.variables = variables;

    this.isLocal = isLocal;

  }

  

  protected Object execute(CommandContext commandContext, ExecutionEntity execution) {

    if (isLocal) {

      execution.setVariablesLocal(variables);

    } else {

      execution.setVariables(variables);

    }

    

    // ACT-1887: Force an update of the execution's revision to prevent simultaneous inserts of the same

    // variable. If not, duplicate variables may occur since optimistic locking doesn't work on inserts

    execution.forceUpdate();

    return null;

  }

  

  @Override

  protected String getSuspendedExceptionMessage() {

    return "Cannot set variables because execution '" + executionId + "' is suspended";

  }

  

}
protected Object execute(CommandContext commandContext, ExecutionEntity execution) 这个代码就是子类实现的逻辑。


你可能感兴趣的:(Activiti)