【问题标题】:Synchronizing two state machines同步两个状态机
【发布时间】:2009-06-09 13:19:48
【问题描述】:

假设,我正在构建一个业务流程管理应用程序。它具有以下实体:问题和任务,作为 1 个问题与多个任务相互关联。任务和问题都有自己的状态,一个状态可能会影响另一个状态。

例如,它们都具有“已取消”和“已完成”状态。当我将问题状态更改为“已取消”时,其所有任务都应变为“已取消”。当我将所有任务的状态更改为“已完成”时,问题应自动变为“已完成”。

假设两个实体都有相当多的状态,并且从一种状态转换到另一种状态的逻辑可能会发生变化,那么是否有任何设计模式和/或最佳实践来处理这种情况?

【问题讨论】:

    标签: design-patterns state-machine


    【解决方案1】:

    想到的设计模式是“规则”;-)

    或者,如果您愿意,可以使用命令模式

    换句话说,对于这种情况,我会创建一个数据库表,列出状态和可接受的转换,并将一个操作与每个转换关联(使用反射)

    我发现这对于处理转换操作比仅仅更新状态以匹配更复杂的情况很有用。

    例如,在一个系统中,我们有一个工作流程,其中请求文档必须通过多个委员会审核站,每个审核站都可以拒绝或将文档传递到下一阶段,外加自定义副作用处理。 在开发过程中,委员会的组织、处理结构和处理行为发生了重大变化,在部署的第一年又发生了五次变化。

    【讨论】:

    • 这就是我们现在使用的 - 一种针对问题执行操作的服务。这是管理工作流的一个很好的模式,但它并不能真正帮助以干净透明和可维护的方式同步两个状态机。
    • 一个相当于“使状态相同”的动作不能解决问题吗?
    • 我真的无法想象这样的动作。假设我有一个 CancelIssueAction,它将问题的状态更新为“已取消”。如果我也想取消该问题的所有任务,我需要将其编码为 CancelIssueAction,这不是很透明。
    • 我在想一些更通用的东西,比如 PropagateIssueState,将给定问题的所有操作设置为与问题相同的状态。然而,在实践中,我很可能会使用更具体的 CancelIssueAction 行为来预测副作用(例如通知正在处理正在进行的操作的人该操作已被取消!)
    【解决方案2】:

    对于这类事情,我更喜欢观察者模式:http://en.wikipedia.org/wiki/Observer_pattern 在您给出的示例中,我会让任务观察他们的问题,而问题观察他们的任务。当一个问题被标记为已取消时,任务会看到并将自己标记为已取消。当一项任务被标记为已完成时,问题会看到它并检查其他任务是否已完成,等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2012-06-08
      • 2013-07-22
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多