当前位置: 首页 > news >正文

状态模式的C++实现示例

核心思想

状态模式(State Pattern) 是一种行为设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的逻辑分散到不同的状态类中,避免了使用大量的条件语句来处理不同状态下的行为。

状态抽象化:将对象的状态抽象为独立的类,每个状态类实现与该状态相关的行为。
上下文委托:上下文对象(Context)持有一个状态对象的引用,并将行为委托给当前状态对象。
状态切换:状态类负责在适当的时候切换到其他状态,上下文对象只需更新当前状态的引用。

使用场景

对象的行为依赖于它的状态,并且需要在运行时根据状态改变行为。
代码中包含大量与状态相关的条件分支,且这些分支在多个地方重复出现。
需要清晰地管理状态的转换逻辑,避免状态相关的代码分散在多个地方。

优点

消除条件分支:将状态相关的逻辑分散到状态类中,避免了复杂的条件判断。
易于扩展:新增状态时只需添加新的状态类,无需修改现有代码。
提高可读性:状态转换逻辑集中在状态类中,代码更清晰易懂。

缺点

类数量增加:每个状态都需要一个类,可能会导致类的数量膨胀。
状态转换逻辑分散:状态转换逻辑分布在各个状态类中,可能会增加调试难度。

示例代码

#include <iostream>
#include <memory>// 前向声明
class State;// 上下文类:电灯
class Light {
private:std::shared_ptr<State> state_; // 当前状态public:Light(std::shared_ptr<State> state);void setState(std::shared_ptr<State> state); // 设置状态void pressSwitch(); // 按下开关
};// 抽象状态类
class State {
public:virtual ~State() = default;virtual void handle(Light& light) = 0; // 处理行为
};// 具体状态类:开状态
class OnState : public State {
public:void handle(Light& light) override;
};// 具体状态类:关状态
class OffState : public State {
public:void handle(Light& light) override;
};// Light 类的实现
Light::Light(std::shared_ptr<State> state) : state_(state) {}void Light::setState(std::shared_ptr<State> state) {state_ = state;
}void Light::pressSwitch() {state_->handle(*this); // 委托给当前状态处理
}// OnState 类的实现
void OnState::handle(Light& light) {std::cout << "Turning light off." << std::endl;light.setState(std::make_shared<OffState>()); // 切换到关状态
}// OffState 类的实现
void OffState::handle(Light& light) {std::cout << "Turning light on." << std::endl;light.setState(std::make_shared<OnState>()); // 切换到开状态
}// 客户端代码
int main() {// 初始状态为关Light light(std::make_shared<OffState>());// 按下开关,切换状态light.pressSwitch(); // 开light.pressSwitch(); // 关light.pressSwitch(); // 开return 0;
}

输出结果

Turning light on.
Turning light off.
Turning light on.

代码解析

Light 类:上下文类,持有一个状态对象的指针,并将行为委托给当前状态。
State 类:抽象状态类,定义了状态的行为接口。
OnState 和 OffState 类:具体状态类,实现了状态的行为和状态转换逻辑。
状态切换:在 handle 方法中,状态类负责切换到下一个状态。


http://www.mrgr.cn/news/94280.html

相关文章:

  • 【具身相关】legged_gym, isaacgym、rsl_rl关系梳理及相关笔记
  • Python规则引擎DIY:从零开始构建规则引擎
  • [Ai 力扣题单] 数组基本操作篇 27/704/344
  • [C语言笔记]07、数组
  • 数据结构--【栈与队列】笔记
  • 【自学笔记】MoonBit语言基础知识点总览-持续更新
  • WPF 与 GMap.NET 结合实现雷达目标动态显示与地图绘制
  • Android SharedPreference 详解
  • UVC摄像头命令推流,推到rv1126里面去
  • 各种attention mode有什么区别?
  • 边缘 AI 探索:EdgeOne 借力 DeepSeek R1 加速落地
  • AI 大模型统一集成|让 AI 聊天更丝滑:WebSocket 实现流式对话!
  • 变量赋值汇编
  • 二分查找易错点分析报告
  • 图论·拓扑排序
  • 多数元素——面试经典150题(力扣)
  • Leetcode 刷题笔记1 动态规划part08
  • 【原创】springboot+vue智能办公管理系统设计与实现
  • 学习springboot-Bean管理(Bean 注册,Bean 扫描)
  • ESP-IDF ubuntu版本 V5.2