freeCodeCamp/guide/chinese/software-engineering/design-patterns/finite-state-machine/index.md

66 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Finite State Machine
localeTitle: 有限状态机
---
有限状态机FSM是一种软件设计模式其中给定模型通过外部输入转换到其他行为状态。
## 有限状态机
FSM由其**状态** **初始状态**和**转换定义** 。
FSM的力量来自于在不同条件下明确定义不同_行为_的能力。通常FSM与循环行为脚本一起使用该脚本不断地评估循环或事件中的当前情况。
为了帮助形成如何应用这一点的图像将使用咖啡机作为有限状态机的示例。我们还将介绍状态图以可视化FSM并提供编码示例。
### 状态图
![咖啡机有限状态机图](https://raw.githubusercontent.com/arunma/blogimages/master/AkkaFSM/CoffeeMachineFSM.png) 该图显示了咖啡机的三种可能状态:
* 打开
* 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
1. 其每个转换由其源状态和输入符号_唯一_确定
2. 每次状态转换都需要读取输入符号。
NFA不需要遵守这些限制这意味着每个DFA也是NFA。 由于它们都只识别常规语言因此可以使用powerset构造算法将每个NFA转换为等效的DFA。
那么我们期望在NFA中找到哪种规则而不是DFA
1. NFA可以具有_空字符串_转换通常用epsilon表示。意味着当处于转换规则的epsilon的某个状态时机器可以转换到下一个状态而不读取输入符号
2. 在NFA中每对状态和转换符号可以具有多个目标状态而不是DFA中的对的唯一目标
3. 每对状态和转换符号为其可能的每个目标生成计算的“分支”,从而创建某种多线程系统。
4. 如果输入字符串落在接受状态以外的任何状态则DFA将拒绝输入字符串。在NFA中我们只需要一个“分支”来接受接受状态以接受字符串。