C++ 设计模式-状态模式

发布于:2025-02-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

火箭状态模式,涵盖发射、多级分离、入轨、返航、紧急状态等流程,以及状态间的转换逻辑:


状态设计

  1. 状态列表

    • IdleState(待机)
    • PreparingState(准备)
    • LaunchingState(发射中)
    • FirstStageSeparatingState(一级分离)
    • SecondStageSeparatingState(二级分离)
    • ThirdStageSeparatingState(三级分离)
    • OrbitingState(轨道运行)
    • ReturnPreparingState(返航准备)
    • ReturningState(返航中)
    • EmergencyState(紧急状态)
    • LandedState(着陆)
  2. 状态转换图

    Idle → Preparing → Launching → FirstStageSeparating → SecondStageSeparating → ThirdStageSeparating → Orbiting
      ↑      |               |           |                     |                       |             ↓
      |      |               |           |                     └─── EmergencyState ←───┘             |
      |      ↓               ↓           ↓                                                           ↓
      └── LandedState ←─ Returning ←─ ReturnPreparing ←──────────────────────────────────────────────┘
    

完整代码实现

#include <iostream>
#include <memory>
#include <stdexcept>

class Rocket;

// 抽象状态基类
class RocketState {
   
public:
    virtual void StartPreparation(Rocket& rocket) {
    Error("准备"); }
    virtual void StartLaunch(Rocket& rocket)      {
    Error("发射"); }
    virtual void SeparateStage(Rocket& rocket)    {
    Error("分离"); }
    virtual void EnterOrbit(Rocket& rocket)       {
    Error("入轨"); }
    virtual void ReturnToEarth(Rocket& rocket)    {
    Error("返航"); }
    virtual void HandleEmergency(Rocket& rocket)  {
    Error("紧急处理"); }
    virtual void Land(Rocket& rocket)             {
    Error("着陆"); }
    virtual ~RocketState() = default;

protected:
    void Error(const std::string& action) {
   
        std::cout << "[Error] 当前状态不支持 " << action << " 操作!\n";
    }
};

// ---------- 具体状态类 ----------
class IdleState : public RocketState {
   
public:
    void StartPreparation(Rocket& rocket) override;
};

class PreparingState : public RocketState {
   
public:
    void StartLaunch(Rocket& rocket) override;
    void HandleEmergency(Rocket& rocket) override;
};

class LaunchingState : public