c++如何实现一个简单的状态机_c++状态设计模式应用

admin 百科 11
答案:C++中可通过状态模式实现状态机,定义抽象状态类和具体状态类处理行为,上下文类持有当前状态并委托调用,示例交通灯在红、绿、黄间切换,每调用change则按逻辑转换状态,输出对应信息。该方式避免大量条件判断,提升可维护性与扩展性,新增状态无需修改原有代码,符合开闭原则,适用于状态多且转换复杂的系统如游戏控制或UI流程。

c++如何实现一个简单的状态机_c++状态设计模式应用-第1张图片-佛山资讯网

在C++中实现一个简单的状态机,可以采用状态模式(State Pattern),这是一种行为设计模式,它允许对象在内部状态改变时修改其行为。通过将每个状态封装成独立的类,可以让状态转换更清晰、可维护性更强。

1. 状态模式的基本结构

状态模式的核心是定义一个状态接口,各个具体状态实现该接口,同时上下文(Context)持有当前状态的指针,并将状态相关的行为委托给当前状态对象。

示例:交通灯状态机(红、绿、黄)

#include <iostream>
#include <memory>

// 前向声明
class TrafficLight;

// 抽象状态类
class LightState {
public:
    virtual ~LightState() = default;
    virtual void change(TrafficLight& light) = 0;
    virtual std::string getStateName() const = 0;
};

// 具体状态类 - 红灯
class RedState : public LightState {
public:
    void change(TrafficLight& light) override;
    std::string getStateName() const override { return "Red"; }
};

// 具体状态类 - 绿灯
class GreenState : public LightState {
public:
    void change(TrafficLight& light) override;
    std::string getStateName() const override { return "Green"; }
};

// 具体状态类 - 黄灯
class YellowState : public LightState {
public:
    void change(TrafficLight& light) override;
    std::string getStateName() const override { return "Yellow"; }
};

登录后复制

2. 上下文类管理状态

TrafficLight 类作为上下文,持有一个当前状态的智能指针,并提供接口触发状态切换。

class TrafficLight {
private:
    std::unique_ptr<LightState> currentState;

public:
    TrafficLight(std::unique_ptr<LightState> state) : currentState(std::move(state)) {}

    void setState(std::unique_ptr<LightState> state) {
        currentState = std::move(state);
    }

    void requestChange() {
        currentState->change(*this);
    }

    std::string getCurrentState() const {
        return currentState->getStateName();
    }
};

登录后复制

3. 实现状态切换逻辑

每个状态的 change 方法决定下一个状态是什么,并通过上下文更新状态。

立即学习“C++免费学习笔记(深入)”;

标签: ai c++ ios switch stream red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~