C++有限状态机
·
一、是什么?
C++有限状态机(Finite State Machine, FSM) 是一种用于管理对象行为的设计模式,它让对象在不同的状态之间转换,每个状态有不同的行为。
1. 状态(States)
对象可能处于的各种情况
enum class TrafficLightState {
RED,
YELLOW,
GREEN
};
2. 事件(Events)
触发状态转换的动作
enum class TrafficEvent {
TIMER_EXPIRED,
EMERGENCY_STOP
};
3. 转换(Transitions)
状态之间的切换规则
// 红灯 -> 定时器到期 -> 绿灯
📝 简单示例
// 状态机类
class TrafficLight {
private:
enum State { RED, YELLOW, GREEN };
State currentState;
public:
TrafficLight() : currentState(RED) {}
void handleEvent(Event event) {
switch (currentState) {
case RED:
if (event == TIMER_EXPIRED) {
currentState = GREEN;
cout << "红灯变绿灯" << endl;
}
break;
case GREEN:
if (event == TIMER_EXPIRED) {
currentState = YELLOW;
cout << "绿灯变黄灯" << endl;
}
break;
case YELLOW:
if (event == TIMER_EXPIRED) {
currentState = RED;
cout << "黄灯变红灯" << endl;
}
break;
}
}
};
🎮 比喻1:电灯开关
想象一个电灯,它只有两种状态:
-
状态1:关灯 💡
-
状态2:开灯 💡(亮)
事件(你的动作):
-
按开关
规则:
-
如果现在是"关灯"状态 → 你按开关 → 变成"开灯"状态
-
如果现在是"开灯"状态 → 你按开关 → 变成"关灯"状态
这就是最简单的状态机!只有两个状态,一个事件。
🚗 比喻2:汽车变速箱
你的汽车变速箱有几个状态:
-
P档(停车)
-
R档(倒车)
-
N档(空档)
-
D档(前进)
事件:你换挡的动作
规则:
-
从P档只能换到R档或D档(不能直接跳到N档)
-
从D档可以换到N档,但不能直接换到P档
-
每个档位有特定的功能
🎵 比喻3:音乐播放器
播放器的状态:
-
▶️ 播放中
-
⏸️ 暂停中
-
⏹️ 停止中
事件:你按的按钮
规则:
-
如果正在播放 → 按暂停 → 变成暂停
-
如果暂停中 → 按播放 → 继续播放
-
如果停止中 → 按播放 → 开始播放
🧠 总结成大白话:
有限状态机就像:
"一个东西在不同情况下会变成不同的模样,而且变化是有规律的,不是随便乱变的"
三个关键点:
-
有限个状态:就像人只有"醒着"、"睡着"、"吃饭"等有限状态
-
明确的事件:就像"闹钟响"、"肚子饿"这些触发条件
-
确定的规则:就像"睡着时被闹钟吵醒就会变成醒着"
更多推荐
所有评论(0)