我想模拟一种有限状态机(有限状态机)。我有一系列状态(比如,从StateA到StateZ)。这个序列被称为一个链,并在内部实现为一个List。我将按照我希望它们运行的顺序添加状态。设计状态链
我的目的是能够在我的电脑中制作一系列动作(例如,鼠标点击)。 (我知道这已经完成了数十亿次)。
所以的状态定义为:
boolean Precondition()
< - 检查是否为这种情况下,有些情况是真实的。例如,如果我想单击程序的“记录”按钮,在此方法中,我将检查程序的进程是否正在运行。如果是,则转到链表中的下一个状态,否则,转到定义为失败状态的内容(通常是它们的第一个状态)。IState GetNextState()
< - 返回下一个要评估的状态。如果Precondition()成功,它应该产生链中的下一个状态,否则它应该产生失败状态。Run()
只需检查Precondition()
并设置内部数据,以使GetNextState()
按预期工作。
于是,一个很自然的做法,这将是这样的:
Chain chain = new Chain();
//chain.AddState(new State(Precondition, FailState, NextState) <- Method structure
chain.AddState(new State(new WinampIsOpenCondition(), null, new <problem here, I want to referr to a state that still wasn't defined!>);
最大的问题是,我想打,在这一点仍然没有被定义为一个国家的参考。我可以通过使用字符串来回避状态并使用内部散列表来避开这个问题,但是没有更清晰的选择吗?
我只能在构造函数中传递前提条件和失败状态,让执行前的链条在每个状态下将正确的下一个状态放在公共属性中,但这看起来有些尴尬。