用于在状态之间切换或循环的设计模式

时间:2015-11-10 10:26:49

标签: design-patterns architecture

是否有设计模式(如访问者,策略,状态等)或其他一些设计原则,以帮助设计一个良好的解决方案来模拟实体的状态流,例如 < strong>任务 实体。

任务以 状态启动,然后进入 BeingHandled 状态,然后 WaitingForApproval 然后可以将其移至 已完成 未批准 ,这基本上是回到 BeingHandled 的附加信息,说它是从 WaitingForApproval 返回的。

所以一般来说我们有一些一般的流程,然后我们可以在其中有一些内部流程。

谢谢,

ashilon

3 个答案:

答案 0 :(得分:6)

这不是一种模式,而是一个概念:有限状态机

总之,它是一个状态机,它只能在一个时刻具有活动状态。

Check what Wikipedia article在第一段中说:

  

有限状态机(FSM)或有限状态自动机(复数:   自动机),或简称为状态机,是数学模型   计算用于设计计算机程序和顺序逻辑   电路。它被设想为一个抽象的机器,可以在其中一个   有限数量的州。机器一次只能处于一种状态;   它在任何给定时间所处的状态称为当前状态。它   当由触发启动时,可以从一种状态改变为另一种状态   事件或条件;这称为过渡。特定的FSM是   由其状态列表定义,以及每个状态的触发条件   过渡。

答案 1 :(得分:2)

管理状态的模式称为状态设计模式 - State Pattern on Wikipedia

它基本上将有限状态机中的各种椭圆/状态表示为基本状态类/接口的子类。在您的情况下,状态将是BeingHandled,WaitingForApproval,Finished,Not Approroved等。

将有一个状态处理程序类,它将保存系统的当前状态(currentState实例变量),该状态将是对基本状态类/接口的引用,但将根据当前状态保存其中一个子状态系统所处的状态。

所有可能在所有州共同发生的事件将形成State Base类中方法的超集。那些“可以”处理这些事件的状态将在调用这些事件时编写必要的逻辑。其余的事件将是该州的IllegalOperations。这些事件基本上将currentState中的currentState更改为另一个状态。

另外,请注意,您需要具有可用于分配给状态处理程序的currentState属性的不同状态的实例。你可以为这些州制造工厂。

我希望我能够向你解释......但是在白板上它更容易......如果有什么不清楚,请告诉我。

为了补充上述说明,我在博客上添加了一篇详细的文章解释状态设计模式 - http://www.javabrahman.com/design-patterns/state-design-pattern-in-java/

答案 2 :(得分:1)

  

一个任务以新状态启动,然后进入BeingHandled状态,然后进入WaitingForApproval,然后它可以移动到Finished或NotApproved,它基本上回到了带有其他信息的BeingHandled,说它是从WaitingForApproval返回的。

正如其他人所提到的,有限状态机(FSM)方法是一种建模所需行为的方法。 状态基本上是您提到的状态,但您还需要定义将任务从一个状态转换到另一个状态的转换

在开始编码之前,我建议您草拟FSM并将其显示给您的同事(或客户),以确认状态和转换与您尝试解决的问题中的工作方式一致。更改白板上的图表比更改代码更容易。我使用PlantUML和PlantText.com快速生成图表,但白板更快。

我冒昧地开始做某事(我添加了一些任意的过渡),但它应该有所帮助。您可以删除某些状态,例如,NewBeingHandled可能是相同的状态,如果您无法真正想到将系统从一个转换到另一个的转换。同样,BeingHandledWaitingForApproval也可以是相同的状态,如果您所做的只是批准/拒绝任务。尽量保持简单。

Finite state machine for Task objects in PlantUML

最后,当您要对其进行编码时,您不必使用状态模式(正如某些人所建议的那样)。它增加了解决方案的复杂性,因为每个状态都是一个单独的类(有时可能很有用,但如果你有很多状态或转换,它就很难维护)。 FSM已经存在了很长时间,并且可以使用二维阵列轻松编码。请查看How to implement a FSM - Finite State Machine in Java上的问题或询问Google。