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

【C++】状态模式

目录

  • 一、模式核心概念与结构
  • 二、C++ 实现示例:自动售货机状态管理
  • 三、状态模式的关键特性
  • 四、应用场景
  • 五、状态模式与其他设计模式的关系
  • 六、C++ 标准库中的状态模式应用
  • 七、优缺点分析
  • 八、实战案例:TCP 连接状态管理
  • 九、实现注意事项
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

状态模式(State Pattern)是一种【行为型】设计模式,它允许对象在其内部状态发生变化时改变其行为,看起来就像该对象改变了它的类一样。这种模式将状态相关的行为封装在独立的状态类中,并将状态转换逻辑集中管理,使系统更易于维护和扩展。

一、模式核心概念与结构

状态模式包含三个核心角色:

  1. 上下文(Context):定义客户端感兴趣的接口,维护一个当前状态的引用。
  2. 状态接口(State):定义特定状态下的行为接口,所有具体状态类必须实现该接口。
  3. 具体状态(Concrete State):实现状态接口,封装与特定状态相关的行为,并负责状态转换。

二、C++ 实现示例:自动售货机状态管理

以下是一个自动售货机的示例,演示如何使用状态模式管理不同状态下的行为:

#include <iostream>
#include <string>
#include <memory>// 前向声明
class VendingMachine;// 状态接口
class State {
public:virtual ~State() = default;virtual void insertMoney(VendingMachine* machine, double amount) = 0;virtual void selectProduct(VendingMachine* machine, const std::string& product) = 0;virtual void dispense(VendingMachine* machine) = 0;virtual void cancel(VendingMachine* machine) = 0;virtual std::string getStateName() const = 0;
};// 上下文:自动售货机
class VendingMachine {
private:std::shared_ptr<State> currentState;double balance;std::string selectedProduct;double productPrice;public:VendingMachine();void setState(std::shared_ptr<State> state) {currentState = state;std::cout << "State changed to: " << currentState->getStateName() << std::endl;}void insertMoney(double amount) {currentState->insertMoney(this, amount);}void selectProduct(const std::string& product) {currentState->selectProduct(this, product);}void dispense() {currentState->dispense(this);}void cancel() {currentState->cancel(this);}double getBalance() const { return balance; }void setBalance(double amount) { balance = amount; }std::string getSelectedProduct() const { return selectedProduct; }void setSelectedProduct(const std::string& product) { selectedProduct = product; }double getProductPrice() const { return productPrice; }void setProductPrice(double price) { productPrice = price; }
};// 具体状态:待机状态
class IdleState : public State {
public:void insertMoney(VendingMachine* machine, double amount) override {machine->setBalance(amount);std::cout << "Money inserted: " << amount << std::endl;machine->setState(
http://www.lryc.cn/news/579416.html

相关文章:

  • GitHub 解码指南:用 AI 赋能,五步快速掌握任意开源项目
  • MySQL 8.0 OCP 1Z0-908 题目解析(20)
  • MVC 架构设计模式
  • 【Linux仓库】进程优先级及进程调度【进程·肆】
  • 小黑黑日常积累大模型prompt句式2:【以段落的形式输出,不分点列举】【如果没有相关内容则不输出】【可读性强】【输出格式规范】
  • Java学习第八部分——泛型
  • git 中删除提交历史
  • 代码随想录算法训练营第四十五天|动态规划part12
  • Fiddler中文版抓包工具在后端API调试与Mock中的巧用
  • 应用在核电行业的虚拟现实解决方案
  • Laravel8中调取腾讯云文字识别OCR
  • 【前端开发】Uniapp分页器:新增输入框跳转功能
  • SpringCloud系列(49)--SpringCloud Stream消息驱动之实现生产者
  • Rubber Band Algorithm 应力及反作用力测试
  • 运维打铁: 企业运维开发痛点之解决方案
  • ModuleNotFoundError: No module named ‘onnxruntime‘
  • 【免费.NET方案】CSV到PDF与DataTable的快速转换
  • 图论基础算法入门笔记
  • MySQL 8.0 OCP 1Z0-908 题目解析(18)
  • 深度学习2(逻辑回归+损失函数+梯度下降)
  • 在 VSCode 中高效配置自定义注释模板 (无需插件)
  • Python 中如何使用 Conda 管理版本和创建 Django 项目
  • Flowable多引擎架构搭建方案
  • 车载以太网-IP 掩码 vlan 端口
  • 前端的一些报错
  • Odoo 中国特色高级工作流审批模块研发
  • 编程基础:成员函数
  • 【LUT技术专题】3DLUT压缩-CLUT
  • 朝鲜APT组织使用Nim语言恶意软件对macOS发起隐秘Web3与加密货币攻击
  • .net wpf混淆