zoukankan      html  css  js  c++  java
  • 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) 这个代码就是子类实现的逻辑。


  • 相关阅读:
    树链剖分总结
    主席树总结
    BZOJ1053:反素数(数学)
    CH3101 阶乘分解
    2018-2019 ACM-ICPC ECfinal I. Misunderstood … Missing
    洛谷P3201 [HNOI2009]梦幻布丁(链表 + 启发式合并)
    Codeforces Round #552 (Div. 3) 题解
    线段树合并 总结
    生成器
    Python中input()和raw_input()的区别
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/3677252.html
Copyright © 2011-2022 走看看