更新:
使用状态模式可能不是解决这个问题的正确方法。因此,欢迎使用任何其他模式。基本上,我正在寻找一种方法来为每个状态设置保护条件,同时拥有干净且易于维护的代码。像emberjs、ui-router和react-router这样的前端路由系统如何实现“保护条件”,以避免在不满足条件的情况下进入特定状态?
我想使用状态模式实现有限状态机,但我无法理解它。简单说就是:
If error -> error state
If A && B && C -> second state
If only A -> first state
在任何状态下,出现错误时,我们都进入错误状态。输入事件A、B和C可能以任何顺序到达,但如果它们全部通过,我们就会进入第二个状态。如果只有输入A适用,则我们会进入第一个状态。以下状态图摘自Martin Fowler的领域特定语言书籍。
他在描述中说:
“Grant小姐在她的卧室里有一个通常被锁上和隐藏起来的秘密隔间。要打开它,她必须关闭门,然后打开她的第二个抽屉并打开床头灯(无论先后顺序如何)。完成这些步骤后,她就可以解锁秘密面板。”
我强调,“打开床头灯”和“打开第二个抽屉”可以以任何顺序发生,与A、B和C同理。
基于@SQLPolice的评论和该书,我画了这个:
但问题是,我可能拥有(A && B && C && D && D && E)。在这种情况下,拥有所有组合中间状态会很麻烦。
lex
,flex
等(用于词法分析)。它们会创建带有许多标签和goto
跳转的 C 代码... - SQL Police