推荐答案
-- -------------------- ---- ------- ----- ------------------ - ------------------------- ------------ - ---------- - ------------- ---------------- - ------------ - ------------------ - ----- ---------- - ----------------------------- -- ----------- -- ------------------- - ---------- - ------------------- ------ ----- -- ------ - ------ ------ -- ------ - ---------- - ------ ----------- - - -- ---- ----- --- - --- ------------------------- - ------ - --------- ---- -- ----- - ---------- ------ -------- ---------- -- ------------ ---------- ---- - --- ---------------------------- -- --- ----- ------------------------- ---------------------------- -- --- ---- ----------------------- ---------------------------- -- --- ---------- ------------------------- ---------------------------- -- --- ---- ------------------------- -- ------ ---------------------------- -- --- ---- --------
本题详细解读
有限状态机 (FSM) 是一种计算模型,它在任何给定时间都只能处于有限数量的状态之一。状态机根据接收到的输入(在我们的例子中是 action)从一个状态转换到另一个状态。
实现思路:
构造函数 (
constructor
):- 接收
initialState
作为初始状态,并将其赋值给this.state
。 - 接收
transitions
对象,该对象描述了状态之间的转换规则。transitions
对象的键是当前状态,值是另一个对象,该对象的键是触发状态转换的动作,值是目标状态。
- 接收
transition(action)
方法:- 根据当前状态
this.state
从this.transitions
中获取对应的转换规则transition
。 - 检查是否存在
transition
并且是否存在指定action
对应的目标状态。 - 如果存在,则更新
this.state
为目标状态并返回true
表示状态转换成功。 - 如果不存在,则返回
false
表示状态转换失败,当前状态保持不变。
- 根据当前状态
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 状态管理、游戏逻辑等。