C++ 状态机开发

1.状态机的基本概念

1.1 状态(State):表示系统当前的条件或环境。比如,在交通信号灯的例子中,状态可以是红灯、绿灯或黄灯。

1.2 事件(Event):表示某个外部或内部的动作,导致状态的改变。事件可以是定时器到期、传感器输入、用户操作等。

1.3 转换(Transition):从一个状态到另一个状态的过程。状态转换可以是由事件引起的,也可以是时间驱动的。

1.4 动作(Action):在状态转换时或在进入某个状态时执行的操作。这些操作可以是日志记录、状态初始化等。

2.状态机的设计

通常,状态机的设计分为以下几个步骤:

定义状态:通过枚举或常量定义状态。

实现状态机类:设计一个类来管理状态和状态转换逻辑。

定义事件和动作:处理状态转换的条件和触发的动作。

集成和测试:将状态机类应用到实际场景中,并测试其行为。

3.示例

3.1. 定义状态枚举

使用枚举来定义信号灯的三种状态:红灯、绿灯和黄灯。

复制代码
enum class TrafficLightState {
    RED,
    GREEN,
    YELLOW
};

3.2. 定义状态机类

创建一个类来管理信号灯的状态和状态转换逻辑。

复制代码
#include <iostream>
#include <string>

class TrafficLightStateMachine {
public:
    TrafficLightStateMachine() : currentState(TrafficLightState::RED) {}

    // 处理状态转换逻辑
    void handleEvent() {
        switch (currentState) {
            case TrafficLightState::RED:
                transitionToState(TrafficLightState::GREEN);
                break;
            case TrafficLightState::GREEN:
                transitionToState(TrafficLightState::YELLOW);
                break;
            case TrafficLightState::YELLOW:
                transitionToState(TrafficLightState::RED);
                break;
        }
    }

    TrafficLightState getCurrentState() const {
        return currentState;
    }

private:
    TrafficLightState currentState;

    void transitionToState(TrafficLightState newState) {
        // 执行状态转换时的动作
        std::cout << "Transitioning from " << getStateName(currentState) 
                  << " to " << getStateName(newState) << std::endl;
        currentState = newState;
    }

    std::string getStateName(TrafficLightState state) const {
        switch (state) {
            case TrafficLightState::RED: return "Red Light";
            case TrafficLightState::GREEN: return "Green Light";
            case TrafficLightState::YELLOW: return "Yellow Light";
            default: return "Unknown";
        }
    }
};

3.3. 使用状态机

在main函数中模拟交通信号灯的运行。

复制代码
#include <thread>
#include <chrono>

int main() {
    TrafficLightStateMachine trafficLight;

    for (int i = 0; i < 6; ++i) {
        trafficLight.handleEvent();
        std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟时间延迟
    }

    return 0;
}

4.其他高级状态机设计

带有条件判断的状态转换:状态转换可以基于更复杂的条件,而不仅仅是简单的事件触发。

带有子状态机的层次化状态机:状态机中的每个状态可以包含子状态机,这样可以将复杂的逻辑分解为更小的模块。

带有并行状态的状态机:可以设计状态机中的某些状态是并行执行的,即多个状态可以同时处于活动状态。

5.应用场景

通信协议处理:如 TCP/IP 协议栈中的各个协议层处理。

游戏开发:控制角色的状态(移动、攻击、死亡等)。

用户界面:基于用户输入的状态转换。

工业控制系统:在工业自动化中,状态机可以用来控制机器的运行状

6.总结

状态机是一种强大且灵活的设计模式,适用于多种场景。通过将复杂的逻辑分解为状态、事件和转换,可以使代码更加模块化、易于理解和维护。


推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/3Zqhgt

相关推荐
How_doyou_do14 分钟前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript
jingfeng51431 分钟前
C++11可变参数模板、emplace系列接口、包装器
开发语言·c++
云天徽上32 分钟前
【数据可视化-107】2025年1-7月全国出口总额Top 10省市数据分析:用Python和Pyecharts打造炫酷可视化大屏
开发语言·python·信息可视化·数据挖掘·数据分析·pyecharts
Tina表姐41 分钟前
(C题|NIPT 的时点选择与胎儿的异常判定)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
c语言·开发语言·数学建模
Kevinhbr1 小时前
CSP-J/S IS COMING
数据结构·c++·算法
蕓晨1 小时前
set的插入和pair的用法
c++·算法
金古圣人2 小时前
hot100 滑动窗口
数据结构·c++·算法·leetcode·哈希算法
蒹葭玉树2 小时前
【C++上岸】C++常见面试题目--算法篇(第二十期)
c++·算法·面试
轮到我狗叫了2 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条
java·开发语言·算法
yudiandian20142 小时前
【QT 5.12.12 下载 Windows 版本】
开发语言·qt