一、是什么?

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:音乐播放器

播放器的状态

  • ▶️ 播放中

  • ⏸️ 暂停中

  • ⏹️ 停止中

事件:你按的按钮

规则

  • 如果正在播放 → 按暂停 → 变成暂停

  • 如果暂停中 → 按播放 → 继续播放

  • 如果停止中 → 按播放 → 开始播放

🧠 总结成大白话:

有限状态机就像:

"一个东西在不同情况下会变成不同的模样,而且变化是有规律的,不是随便乱变的"

三个关键点:

  1. 有限个状态:就像人只有"醒着"、"睡着"、"吃饭"等有限状态

  2. 明确的事件:就像"闹钟响"、"肚子饿"这些触发条件

  3. 确定的规则:就像"睡着时被闹钟吵醒就会变成醒着"

更多推荐