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) 这个代码就是子类实现的逻辑。


原文地址:https://www.cnblogs.com/yg_zhang/p/3677252.html