`
ww2
  • 浏览: 415862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

工作流活动实例状态转换的两种实现模式分析

阅读更多

今天和同事chelsea 就活动实例状态的实现思路上进行了讨论。我们两个站在了两个不同的角度来看待,这两个不同的角度也正好眼下最为常见到的两种实现思路:

      Chelsea是从状态角度来看待,当然也完全是从state pattern的角度来思考:状态在达到某个状态的时候,会引起或必须引起活动实例执行什么操作。

       而我是从活动实例的角度来考虑,活动实例的状态只是活动实例的一个属性体,是因为什么行为,造成了什么状态的结果。

<!----><o:p> </o:p>

       这两种观点,没有谁对谁错,也没有谁优谁劣,两者是站在不同的角度来分析同一个问题。其实这两种模式在应用中都是很普遍的,也都是能够很好的解决问题的。不过在现有的workflow引擎实现中,基于活动实例的角度是占绝大多数的,比如obeshark等等。所以我受这个的影响也是比较深的。

<o:p> </o:p>

       先说说基于活动活动实例的角度的思路吧:

<o:p> </o:p>

       让我下先来看看状态类:

public final class WMActivityInstanceState extends WMObjectState {<o:p></o:p>

   public static final int OPEN_NOTRUNNING_INT = 0;<o:p></o:p>

   public static final int OPEN_SUSPENDED_INT = 1;<o:p></o:p>

}<o:p></o:p>

或者也可以这么表示:<o:p></o:p>

public enum WMActivityInstanceState{<o:p></o:p>

  NOTRUNNIN(0),<o:p></o:p>

  SUSPENDED(1);<o:p></o:p>

  private int code;<o:p></o:p>

  private WMActivityInstanceState(int code){this.code = code;}
  public int getCode(){return this.code}<o:p></o:p>

}

<o:p> </o:p>

       对于活动实例来说,状态只是其一个属性而已:

public class BasicActivityInstance extends BasicAttributedEntity{<o:p></o:p>

private int _state;<o:p></o:p>

    public void setState(int state) {<o:p></o:p>

        _state = state; }<o:p></o:p>

}<o:p></o:p>

或者也可以是<o:p></o:p>

Public void setState(WMActivityInstanceState state)

<o:p> </o:p>

       所以,从活动实例的角度来看,状态之间的关系是平行的。你可以在执行完一些初始化的操作之后,将活动实例的状态设置为Initialized:当然这个操作你必须显示的去设置活动实例(当然,你可以用一些Event去处理),比如调用活动实例的setState方法。至于为什么调用这个方法,或者此时设置的状态是对是错,活动实例并不关心

<o:p> </o:p>

       下面再来说说基于状态角度的思路吧,这个思路大体可以说就是state pattern的应用。

<o:p> </o:p>

       说道这儿,您可以看看这篇文档:从工作流状态机实践中总结状态模式使用心得 。当然如果您对state pattern不是很了解,那么建议你先看看这篇文档:设计模式之state <o:p></o:p>

<o:p> </o:p>

       State模式的着眼点就是状态,以状态的变迁影响实例的行为和动作。其实这就是两个不同的抽象体:statestateOwner,我们可以看到,活动实例对象就表现为stateOwner<o:p></o:p>

       State模式的依据是状态之间是有有向连接关系的,这有向连接关系其实就是状态的转换规则:A-B-C-D-A

       激发状态的变迁,是由外界的事件(Event影响的:这个事件会告知,当前的活动实例状态要从当前状态往下一个状态变迁。而活动实例并不知道下一个状态是什么,这完全是状态对象负责维护和告知的。

      

       至此,我们可以看出来了,两种方式的不同:

第一种方式(基于活动实例),其外界事件是影响到活动实例,或者说在事件中显示的告知活动实例状态从什么变为什么。

       第二种方式(基于实例状态),其外界事件是影响到活动实例状态对象,至于这个状态的下一个状态是什么,时间并不知道,完全由活动状态之间的关系来维护。

分享到:
评论

相关推荐

    工作流系统异常处理实现方法

    工作流异常可以定义为一种对正常工作流流程状态的偏离,这种偏离主要指工作流实例运行状态与其原始定义的不一致,在某些特殊情况下(如工作流模型动态演进),也可能指与所期待状态的不一致。对于工作流异常的分类...

    工作流数据模式workflow data patterns

    除了数据模式外,工作流系统还涉及其他两种重要的模式类型:控制模式和资源模式。 - **控制模式**:这些模式侧重于流程执行的逻辑结构,如分支、循环和条件判断等。它们定义了工作流如何按照预设的规则进行推进。 -...

    UML网上购物活动图和状态图.zip

    在实验4报告中,可能会详细解析上述两种图的构建过程,包括如何定义合适的活动和状态,如何使用泳道来划分不同的参与者,如何设置控制流和数据流,以及如何有效地用状态图表示并发和同步。实验中可能还会涉及UML的...

    基于工作流网的过程挖掘算法

    在实际应用中,"基于工作流网的过程挖掘算法.nh"这个文件可能包含了具体实现这些算法的代码、数据结构、实验结果和案例分析等。深入理解和掌握这些内容,对于从事工作流管理、业务流程优化或相关IT领域的专业人士来...

    .图书借阅管理系统miniLib的状态图和活动图

    本次实验的主要目的是让学生理解和掌握如何绘制状态图和活动图,并通过具体的案例——图书借阅管理系统miniLib来实践这两种图表的绘制方法。通过对系统中的“图书”和“用户”这两个核心对象的状态图和活动图的构建...

    RS232与RS485串行接口转换电路及其编程实现

    因此,需要设计一个转换器来实现两种接口之间的转换。 ##### 2.2 硬件电路设计 为了实现RS232到RS485的转换,需要设计两个关键部分:一是符合RS232通信标准的驱动电路;二是符合RS485通信标准的接口电路。 **...

    电子功用-转换电能的一种电子电路

    "转换电能的一种电子电路.pdf"这份文档可能详细介绍了以上这些概念,并可能包含具体的电路图、工作原理分析、设计原则以及实际应用案例。通过学习这样的资料,工程师们可以掌握构建高效、稳定且适应各种需求的电能...

    78OA工作流设计教程汇编.pdf

    总的来说,这个78OA工作流设计教程是面向所有层次用户的,无论是初次接触OA流程设计的新手,还是有一定经验的用户,都能从中受益。通过系统的教学和丰富的实践案例,用户能够掌握设计高效、符合企业需求的工作流程的...

    UML和模式应用面向对象分析与设计导论

    4. **适配器模式**:将两个不兼容的接口转换为可以互相操作,实现接口的兼容性。 5. **策略模式**:定义一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户端。 在面向对象分析与...

    BIBRED转换器的原理及参数值说明

    它的设计原理和工作模式使其能够在保持高效率的同时,实现输入电压到输出电压的转换。 **工作模式** BIBRED转换器在一个开关周期内有三个主要的工作模式: 1. **导通模式(0≤t≤DuTs)**:开关S1导通,二极管D2...

    FME Desktop培训-7.典型实例讲解

    通过这些实例,我们可以看到FME Desktop不仅提供了广泛的数据格式支持,还具备高度的灵活性和定制化能力,使得用户能够针对特定需求设计和执行高效的数据转换工作流。这些实例涵盖了从基础数据格式转换到高级数据...

    UML和模式应用

    状态图描绘了对象在其生命周期内可能经历的不同状态及转换,活动图则关注流程或行为的控制流。组件图和部署图用于展示系统的物理架构,如何分布在硬件资源上。 接着,书中会深入探讨设计模式的概念,包括工厂模式、...

    编译原理试验:词法分析器

    在这个试验中,我们有两个实现版本的词法分析器:一个用Java编写,另一个用C语言实现。Java是一种面向对象的语言,具有丰富的库支持和自动内存管理,因此它的词法分析器可能更易于理解和维护。C语言版本则更接近底层...

    SpendingSample

    《WorkFlow与WCF在状态机Demo中的应用详解——基于"SpendingSample"的实践解析》 ...通过学习和分析这个示例,开发者可以掌握如何在自己的项目中有效地运用这两种技术,构建出更加灵活、高效的服务型应用。

Global site tag (gtag.js) - Google Analytics