【发布时间】:2015-07-01 07:49:16
【问题描述】:
更新:
状态模式可能是解决此问题的错误方法。因此,欢迎任何其他模式。基本上,我正在寻找一种方法来为每个状态设置保护条件,同时拥有干净且可维护的代码。 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 的评论和书,我画了这个:
但问题是,我可能有 (A && B && C && D && D && E)。在那种情况下,拥有所有的组合临时状态会很麻烦。
【问题讨论】:
-
我假设你有一个开始状态?
-
你在画什么... UML/Flow...?
-
@DavidBarker,两者都不是。我只需要一些直观的东西来理解如何实现。
-
好的,但是当你只有A时,你想进入不同的状态。但是,如果您将 A 作为第一个事件会发生什么?你怎么知道 B 或 C 会跟随?
-
哦,现在画得真好! - 是的,你是对的,当变得更复杂时它会变得非常非常麻烦。这就是您使用工具创建此类状态机的原因——例如
lex、flex等(用于词法分析)。他们创建带有大量标签的 C 代码,goto跳转...
标签: design-patterns state-machine state-pattern state-diagram