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


  • 相关阅读:
    Django ORM操作
    两张表是一对一的关系为什么不直接都放在一张表里面?
    TCP、UDP 详解
    如何使用Xshell连接虚拟机
    selenium中常见的无法定位元素问题
    python中生产者消费者模式
    Selenium 点击后跳转至新窗口无法定位元素问题(element not interactable)
    linux 网络管理
    Linux文件权限
    linux 用户管理命令
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/3677252.html
Copyright © 2020-2023  润新知