3.9 KiB
title | localeTitle |
---|---|
Finite State Machine | 有限状态机 |
有限状态机(FSM)是一种软件设计模式,其中给定模型通过外部输入转换到其他行为状态。
有限状态机
FSM由其状态 , 初始状态和转换定义 。
FSM的力量来自于在不同条件下明确定义不同_行为_的能力。通常,FSM与循环行为脚本一起使用,该脚本不断地评估循环或事件中的当前情况。
为了帮助形成如何应用这一点的图像,将使用咖啡机作为有限状态机的示例。我们还将介绍状态图以可视化FSM并提供编码示例。
状态图
- 打开
- ReadyToBuy
- 已关闭的
这些状态之间的线显示了状态之间和哪个方向可能的转换。这些转换具有FSM何时需要在状态之间切换的条件。
-
StartUpMachine 从PoweredOff状态到Open状态,机器必须启动。在这种情况下,这是手动完成的。
-
存款> =咖啡费用 FSM在一个循环或金额变化时评估存入的现金金额(在这种情况下推荐) 如果您将足够的现金存入咖啡机,FSM将从“打开”变为“ReadyToBuy”。
-
ShutdownMachine 如果满足“不再有咖啡”的条件,机器将通过ShutDownMachine方法自动从Open到PoweredOff。
-
DispenseCoffee 在ReadyToBuy状态下,用户可以购买咖啡,然后将其冲泡和分配。条件是BuyCoffee事件(!链接到观察者模式!)触发。 (未在图中显示)
-
CancelCoffee 如果用户选择取消,则机器将从ReadyToBuy转到Open。
-
ShutDownMachine 机器将进入PoweredOff状态
状态
在每个状态中都有定义的行为,只有在对象处于该状态时才会执行。例如,在PoweredOff期间,咖啡机在打开电源之前不会冲泡咖啡,在打开状态期间它将等待,直到插入足够的现金,直到给出断电命令,或者直到咖啡用完为止。在此打开状态期间,它可以执行诸如清洁之类的例程,这在其他状态下不会发生。
初始状态
每个FSM都有一个初始状态,这意味着它在创建时开始的状态,并且必须在构造或实例化时定义。当然,如果满足条件,可以直接改变状态。
转变
每个州要么经常评估它是否应该转换到另一个州,要么根据触发事件转换到另一个州。
DFA和NFA
有限自动机有两种类型,确定性(DFA)和非确定性(NFA)。它们都接受常规语言并且以与上述相同的方式或多或少地操作,但是存在一些差异。
DFA接受或拒绝一串符号,并且仅为每个输入字符串生成一个唯一计算或自动机。 _确定性_是指计算的唯一性。 如果有限状态机遵循以下规则,则称为DFA:
- 其每个转换由其源状态和输入符号_唯一_确定
- 每次状态转换都需要读取输入符号。
NFA不需要遵守这些限制,这意味着每个DFA也是NFA。 由于它们都只识别常规语言,因此可以使用powerset构造算法将每个NFA转换为等效的DFA。
那么我们期望在NFA中找到哪种规则而不是DFA?
- NFA可以具有_空字符串_转换(通常用epsilon表示)。意味着当处于转换规则的epsilon的某个状态时,机器可以转换到下一个状态而不读取输入符号
- 在NFA中,每对状态和转换符号可以具有多个目标状态,而不是DFA中的对的唯一目标
- 每对状态和转换符号为其可能的每个目标生成计算的“分支”,从而创建某种多线程系统。
- 如果输入字符串落在接受状态以外的任何状态,则DFA将拒绝输入字符串。在NFA中,我们只需要一个“分支”来接受接受状态以接受字符串。