如何使用 JavaScript 实现一个简单的有限状态机 (Finite State Machine)?

推荐答案

-- -------------------- ---- -------
----- ------------------ -
  ------------------------- ------------ -
    ---------- - -------------
    ---------------- - ------------
  -

  ------------------ -
      ----- ---------- - -----------------------------

      -- ----------- -- ------------------- -
          ---------- - -------------------
          ------ ----- -- ------
      -
      ------ ------ -- ------
  -

  ---------- -
    ------ -----------
  -
-

-- ----
----- --- - --- ------------------------- -
  ------ -
    --------- ----
  --
  ----- -
    ---------- ------
    -------- ----------
  --
    ------------
      ---------- ----
    -
---

---------------------------- -- --- -----
-------------------------
---------------------------- -- --- ----
-----------------------
---------------------------- -- --- ----------
-------------------------
---------------------------- -- --- ----

------------------------- -- ------
---------------------------- -- --- ---- --------

本题详细解读

有限状态机 (FSM) 是一种计算模型,它在任何给定时间都只能处于有限数量的状态之一。状态机根据接收到的输入(在我们的例子中是 action)从一个状态转换到另一个状态。

实现思路:

  1. 构造函数 (constructor):

    • 接收 initialState 作为初始状态,并将其赋值给 this.state
    • 接收 transitions 对象,该对象描述了状态之间的转换规则。transitions 对象的键是当前状态,值是另一个对象,该对象的键是触发状态转换的动作,值是目标状态。
  2. transition(action) 方法:

    • 根据当前状态 this.statethis.transitions 中获取对应的转换规则 transition
    • 检查是否存在 transition 并且是否存在指定 action 对应的目标状态。
    • 如果存在,则更新 this.state 为目标状态并返回 true 表示状态转换成功。
    • 如果不存在,则返回 false 表示状态转换失败,当前状态保持不变。
  3. getState() 方法:

    • 返回当前状态 this.state

示例用法说明:

  • 创建 FiniteStateMachine 的实例 fsm,初始状态为 'off',并定义了以下状态转换规则:
    • 'off' 状态下,接收到 'turnOn' action 后,转换到 'on' 状态。
    • 'on' 状态下,接收到 'turnOff' action 后,转换到 'off' 状态。
    • 'on' 状态下,接收到 'alert' action 后,转换到 'alerting' 状态。
    • 'alerting' 状态下,接收到 'confirm' action 后,转换到 'on' 状态。
  • 调用 fsm.getState() 获取当前状态。
  • 调用 fsm.transition(action) 来触发状态转换。
  • 如果触发了不存在的 action,状态保持不变,函数返回 false

核心概念:

  • 状态 (state): FSM 在某一时刻所处的情况。
  • 转换 (transition): 根据接收到的 action 从一个状态移动到另一个状态。
  • 转换规则 (transitions): 定义了每个状态在接收到特定 action 后如何转换。
  • 初始状态 (initialState): FSM 启动时的状态。

优点:

  • 简单易懂: 代码结构清晰,逻辑简单。
  • 易于维护: 状态转换规则集中管理,方便修改和扩展。
  • 可测试性高: 每个状态转换都可以独立测试。
  • 适用性广: 适用于多种场景,例如 UI 状态管理、游戏逻辑等。
纠错
反馈