更新:
状态模式可能是错误的解决方法。因此,欢迎使用任何其他模式。基本上,我正在寻找一种为每个州提供保护条件但又拥有干净且可维护的代码的方法。如果不满足条件,诸如emberjs,ui-router和react-router之类的前端路由系统将如何实现guard conditions
以避免进入特定状态?
我想通过使用状态模式来实现有限状态机,但是我无法将其束之高阁。简而言之,就像:
If error -> error state
If A && B && C -> second state
If only A -> first state
在任何状态下,发生错误时,我们都会进入错误状态。输入(事件)A,B和C可能以任何顺序到达,但是如果它们全部通过,我们将进入第二状态。如果仅输入A适用,那么我们将进入第一状态。
以下状态图摘自Martin Fowler的《领域特定语言》一书。
在描述中他说:
格兰特小姐,她的卧室里有一个秘密隔间通常是锁定和隐藏的。要打开它,她必须关闭门,然后打开她胸部的第二个抽屉并转动她按任一顺序上的床头灯。一旦完成,秘密面板已解锁,可以打开。
我强调指出,turning light
和opening 2nd drawer
可以以两个顺序发生。与A,B和C相同。
基于@SQLPolice注释和这本书,我得出了这一点:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9tU1Azci5wbmcifQ==” alt =“在此处输入图像描述”>
但是问题是,我可能有(A && B && C && D && D && E)。在这种情况下,拥有所有组合的临时状态会很麻烦。
您可以为此使用某种形式的词法分析。我将通过限制从一个状态过渡的能力来解决这个问题,除非满足两个状态之间的限制。我最近在PHP中为Laravel框架编写了一个FSM,其中有一个这样的示例,其中在发生转换之前,所有约束都必须为真。它使用伪状态或状态内的句柄来切换标志,表明进程已完成。仅当所有标志都设置为true时,状态转移。
“>
使用我为laravel编写的FSM软件包,示例FSM设置would look something like this。
每个状态(通过onEnter)或通过伪状态将其在FSM OR State上的约束标志设置为true。
这还将触发checkReady()
,该C0将根据约束标志触发转换或保持当前状态。
添加新约束是将它们添加到状态或包含FSM的约束数组中,并构建一种方法来允许在执行任务时删除约束的情况。
[当您查看多个状态时,每个状态都构成对约束的要求。A sample state would look something like this.
当您使用伪状态/处理程序查看单个状态时。The state would look something like this, where it's logic is contained.
快速草稿如下:
状态机抽象包括: