国家模式和警卫

时间:2015-07-01 07:49:16

标签: design-patterns state state-machine state-diagram

更新

状态模式可能是解决此问题的错误方法。因此,欢迎任何其他模式。基本上我正在寻找一种方法来为每个州提供保护条件,同时拥有干净且可维护的代码。如果条件不满足,前端端路由系统如emberjs,ui-router和react-router如何实现guard conditions以避免进入特定状态?

我想通过使用State Pattern来实现一个有限状态机,但我无法绕过它。简而言之就像:

If error -> error state
If A && B && C -> second state
If only A -> first state

在任何状态下,出错时,我们都会进入错误状态。输入(事件)A,B和C可能以任何顺序到达,但如果它们全部通过,我们将进入第二状态。如果仅输入A,则我们进入第一状态。

以下状态图取自Martin Fowler的领域特定语言书。

DSL

在描述中他说:

  格兰特小姐,她卧室里有一个秘密隔间   这通常是锁定和隐藏的。打开它,她必须关闭   门,然后打开她胸口的第二个抽屉转过身   床头灯亮以任意顺序。一旦完成这些秘密   面板解锁后让她打开。

我强调,turning lightopening 2nd drawer可以在任一顺序中发生。与A,B和C相同。

根据@SQLPolice的评论和书,我画了这个:

enter image description here

但问题是,我可能有(A& B& C& D& D& E& E)。在这种情况下,拥有所有组合临时状态将会非常麻烦。

3 个答案:

答案 0 :(得分:4)

您可以使用某种形式的词法分析。我会通过限制从状态转换的能力来解决这个问题,除非满足在两个状态之间的边缘上的约束。我最近在Laravel框架中用PHP写了一个FSM,它有一个这样的例子,在转换发生之前,各种约束都需要成立。它使用状态内的伪状态或句柄来切换表示进程已完成的标志。只有当所有标志都设置为true时才能进行状态转换。

Sample lexical state analysis

使用我为laravel编写的FSM包,一个示例FSM设置would look something like this

每个状态(onEnter)或通过伪状态将FSM OR状态上的约束标志设置为true。

这也会触发checkReady()触发转换或基于约束标记保持当前状态。

添加新约束是将它们添加到状态或包含FSM中的约束数组并构建方法以允许在执行任务时删除约束的情况。

当您查看多个州时,每个州都会对约束形成要求。 A sample state would look something like this.

当您查看具有伪状态/处理程序的单个状态时。 The state would look something like this, where it's logic is contained.

答案 1 :(得分:3)

快速草案如下:

enter image description here

答案 2 :(得分:1)

状态机抽象包括:

  1. 活动或输入
  2. 转换
  3. 操作
  4. 像&& b& c& c这样的陈述实际上是一个事件或输入......过渡的标签。因此,如果您要适应状态机抽象,则需要将其映射到事件。您需要编写代码来进行映射。

    如果您的状态机通常由这些条件驱动,则需要挂钩b和c更改的事件,或者定期检查它们。任何时候他们改变,你的代码映射到一个事件,并将它们发布到任何代码推进状态机。