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

C++ 设计模式:状态模式(State Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 备忘录

状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为。状态模式将状态的行为封装在独立的状态类中,并将状态的切换逻辑委托给这些状态类,从而使得对象的行为随着状态的变化而变化。

1.问题分析

在开发中,我们经常会遇到对象的行为随着其内部状态的变化而变化的情况。如果我们将所有状态的行为都放在一个类中,会导致以下问题:

  • 代码复杂度增加:所有状态的行为都在一个类中实现,代码会变得非常复杂和难以维护。
  • 难以扩展:如果需要添加新的状态或修改现有状态的行为,需要修改这个类的代码,违反了开闭原则(对扩展开放,对修改关闭)。
  • 状态切换逻辑混乱:状态切换的逻辑和状态的行为混在一起,难以理解和维护。

状态模式通过将状态的行为封装在独立的状态类中,并将状态的切换逻辑委托给这些状态类,从而解决了上述问题。

2.实现步骤

1.定义状态接口:声明所有具体状态类需要实现的方法。
2.定义具体状态类:实现状态接口中的方法,并根据具体状态的行为进行实现。
3.定义上下文类:维护一个当前状态的实例,并提供方法来设置和切换状态。上下文类的方法会调用当前状态实例的方法。

3.代码示例

以机器人状态示例。

3.1.状态接口

// 状态接口
class State {
 public:
  virtual ~State() = default;
  virtual void handle() = 0;
};

3.2.具体状态

// 具体状态类:站起状态
class StandingState : public State {
 public:
  void handle() override { std::cout << "Robot is standing." << std::endl; }
};
// 具体状态类:行走状态
class WalkingState : public State {
 public:
  void handle() override { std::cout << "Robot is walking." << std::endl; }
};
// 具体状态类:挥手状态
class WavingState : public State {
 public:
  void handle() override { std::cout << "Robot is waving." << std::endl; }
};
// 具体状态类:蹲下状态
class SquattingState : public State {
 public:
  void handle() override { std::cout << "Robot is squatting." << std::endl; }
};

3.3.上下文类

// 上下文类
class Robot {
 public:
  Robot(std::shared_ptr<State> state) : state_(state) {}

  void setState(std::shared_ptr<State> state) { state_ = state; }

  void performAction() { state_->handle(); }

 private:
  std::shared_ptr<State> state_;
};

3.4.客户端代码

int main() {
  auto standingState = std::make_shared<StandingState>();
  auto walkingState = std::make_shared<WalkingState>();
  auto wavingState = std::make_shared<WavingState>();
  auto squattingState = std::make_shared<SquattingState>();

  Robot robot(standingState);  // 初始状态为站起

  robot.performAction();  // 输出:Robot is standing.

  robot.setState(walkingState);  // 切换状态为行走
  robot.performAction();         // 输出:Robot is walking.

  robot.setState(wavingState);  // 切换状态为挥手
  robot.performAction();        // 输出:Robot is waving.

  robot.setState(squattingState);  // 切换状态为蹲下
  robot.performAction();           // 输出:Robot is squatting.

  return 0;
}

http://www.kler.cn/a/462975.html

相关文章:

  • C++编程库与框架实战——ZeroMQ消息队列
  • 智联视频超融合平台:电力行业的智能守护者
  • 职场常用Excel基础04-二维表转换
  • 电脑找不到mfc110.dll文件要如何解决?Windows缺失mfc110.dll文件快速解决方法
  • 浏览器选中文字样式
  • Golang的代码质量分析工具
  • FristiLeaks_1.3靶场渗透
  • [羊城杯 2024]1z_misc
  • [创业之路-230]:《华为闭环战略管理》-5-华为的组织架构与业务架构是不同的,组织架构是为业务架构服务
  • Docker网络与数据卷持久化
  • 三、AI知识(自然语言处理)
  • 记录uniapp组件swiper自适应高度
  • 期权懂|个股期权的流动性如何?
  • 生成埃里克卡特曼人工智能语音听起来像他或配音视频
  • PyTorch transpose、permute、view和einops.rearrange
  • LeetCode 热题 100_二叉树的直径(40_543_简单_C++)(二叉树;递归)
  • pip安装paddle失败
  • 【AIGC篇】“智” 造元宇宙新境:AIGC 于虚拟现实的奇幻征途
  • 亚马逊国际站商品爬虫:Python实战指南
  • 【操作系统进程与线程管理:从PCB到多线程并发编程】
  • 基本语法与数据结构:全面掌握 Java 的基础
  • STM32使用UART发送字符串与printf输出重定向
  • 自动驾驶---Tesla FSD Version 13
  • Java排序算法全解析
  • memcached的基本使用
  • arcgis模版空库怎么用(一)