推荐答案
// www.javascriptcn.com code example
class FiniteStateMachine {
constructor(initialState, transitions) {
this.state = initialState;
this.transitions = transitions;
}
transition(action) {
const transition = this.transitions[this.state];
if (transition && transition[action]) {
this.state = transition[action];
return true; // 状态成功转换
}
return false; // 状态转换失败
}
getState() {
return this.state;
}
}
// 示例用法
const fsm = new FiniteStateMachine('off', {
'off': {
'turnOn': 'on'
},
'on': {
'turnOff': 'off',
'alert': 'alerting'
},
'alerting':{
'confirm': 'on'
}
});
console.log(fsm.getState()); // 输出: 'off'
fsm.transition('turnOn');
console.log(fsm.getState()); // 输出: 'on'
fsm.transition('alert')
console.log(fsm.getState()); // 输出: 'alerting'
fsm.transition('confirm')
console.log(fsm.getState()); // 输出: 'on'
fsm.transition('turnOn'); // 不存在的转换
console.log(fsm.getState()); // 输出: 'on' (状态保持不变)本题详细解读
有限状态机 (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 状态管理、游戏逻辑等。