C++状态模式与上下文类配合使用

状态模式通过封装状态行为提升代码可维护性,其核心为上下文、状态接口与具体状态类。上下文委托行为给状态对象,状态间转换由状态类通过持有上下文引用来实现。例如在文档编辑器中,“编辑”与“只读”状态分别处理不同操作,切换时更新上下文状态指针。C++实现中使用共享指针管理状态生命周期,避免循环依赖。优势包括消除复杂条件判断、符合开闭原则,适用于订单系统、游戏角色等状态多变场景。1. 上下文仅负责状态管理;2. 状态类实现具体行为与转换逻辑。正确划分职责可有效提升扩展性与可读性。

c++状态模式与上下文类配合使用

状态模式是一种行为设计模式,适用于对象的行为依赖于其状态,并且在运行时根据状态改变行为的情况。在C++中,通过将状态封装为独立的类,并与上下文(Context)类协作,可以避免大量的条件判断语句,提升代码的可维护性和扩展性。

状态模式的基本结构

状态模式包含三个核心部分:

上下文类(Context):持有当前状态对象的引用,将与状态相关的行为委托给状态对象处理。状态接口(State):定义状态类的公共接口,通常包含一个或多个行为方法。具体状态类(ConcreteState):实现状态接口,封装特定状态下的行为逻辑。

上下文不直接实现行为,而是调用当前状态对象的方法。当状态变化时,上下文切换到不同的状态对象,从而改变其行为。

上下文与状态类的交互方式

为了让状态类能够影响上下文的状态转换,通常让状态类持有对上下文的引用。这样,状态在完成某些操作后可以主动切换上下文的状态。

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

注意:为了避免循环依赖,状态类通常只保存上下文的指针或引用,而不管理其生命周期。

例如,在一个文档编辑器中,用户可以在“编辑”和“只读”状态间切换:

处于“编辑”状态时,允许修改内容。处于“只读”状态时,禁止修改,只能查看。

每次状态改变,上下文更新其内部状态指针,后续操作自动由新状态处理。

实现示例

以下是一个简化的C++实现:

#include #include // 前向声明class Context;// 抽象状态类class State {public:    virtual ~State() = default;    virtual void handleAction(Context& context) = 0;};// 上下文类class Context {private:    std::shared_ptr currentState;public:    void setState(std::shared_ptr newState) {        currentState = newState;    }    void request() {        if (currentState) {            currentState->handleAction(*this);        }    }};// 具体状态Aclass ConcreteStateA : public State {public:    void handleAction(Context& context) override {        std::cout << "Handling in State A. Switching to State B.\n";        context.setState(std::make_shared());    }};// 具体状态Bclass ConcreteStateB : public State {public:    void handleAction(Context& context) override {        std::cout << "Handling in State B. Switching back to State A.\n";        context.setState(std::make_shared());    }};

使用方式:

“`cppint main() { Context ctx; ctx.setState(std::make_shared());

ctx.request(); // 输出: Handling in State A. Switching to State B.ctx.request(); // 输出: Handling in State B. Switching back to State A.return 0;

}

优势与适用场景

状态模式将状态相关的逻辑分离到独立类中,使新增状态或修改现有逻辑更安全、更清晰。

  • 消除复杂的条件分支(如 if/else 或 switch)。
  • 便于添加新状态,符合开闭原则。
  • 适合状态转换规则较复杂的应用,如游戏角色状态、订单流程、UI控件状态等。

关键是上下文与状态之间的职责划分要明确:上下文负责管理状态变更,状态负责定义行为。

基本上就这些。只要理清两者之间的调用关系和生命周期管理,状态模式在C++中就能灵活有效地使用。

以上就是C++状态模式与上下文类配合使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1475147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++对象构造与析构性能优化方法
上一篇 2025年12月18日 23:08:36
C++如何使用模板实现泛型工具函数
下一篇 2025年12月18日 23:08:46

相关推荐

  • mysql下载初始化数据库失败怎么办

    mysql下载初始化数据库失败怎么办mysql下载初始化数据库失败怎么办mysql下载初始化数据库失败怎么办mysql下载初始化数据库失败怎么办

    初始化 MySQL 数据库失败可能是由于以下原因:服务未启动权限不足数据库已存在配置问题磁盘空间不足数据库引擎错误其他未知原因(可查看日志文件) MySQL 下载初始化数据库失败的解决方案 初始化 MySQL 数据库时遇到失败的情况,可能是以下几个原因导致的: 1. MySQL 服务未启动 确保 M…

    2026年9月24日 用户投稿
    100
  • 二手车视频号直播怎么挂载?直播挂载有影响吗?

    二手车视频号直播怎么挂载?直播挂载有影响吗?二手车视频号直播怎么挂载?直播挂载有影响吗?二手车视频号直播怎么挂载?直播挂载有影响吗?二手车视频号直播怎么挂载?直播挂载有影响吗?

    视频号直播中的挂载功能,是推动二手车销售转化的核心利器。通过精准配置商品链接、小程序或留资表单,主播可高效引导观众完成从观看到咨询、下单的全过程。那么,具体该如何操作呢? 一、二手车视频号直播如何实现挂载? 开通直播权限 确保你的视频号已完成实名认证,并满足平台对粉丝数或活跃度的基本要求。进入视频号…

    2026年9月24日 用户投稿
    200
  • Debian系统Tigervnc安全吗

    tigervnc在debian系统上是相对安全的,但和所有远程桌面解决方案一样,它也存在一些潜在的安全风险。以下是对tigervnc在debian系统上安全性的详细分析: Tigervnc的安全性 加密协议:Tigervnc使用RFB协议进行通信,该协议支持加密传输,可以保护数据在传输过程中的安全。…

    2026年9月24日
    100
  • 如何在Java中实现继承

    Java中通过extends实现继承,子类可继承父类非私有成员并扩展功能;支持方法重写(@Override)和super调用父类成员或构造器,构造器需用super()初始化父类,且Java仅支持单继承,可通过接口弥补。 在Java中实现继承,主要通过extends关键字让一个类继承另一个类的属性和方…

    2026年9月24日
    100
  • swoole如何运行

    swoole如何运行swoole如何运行swoole如何运行swoole如何运行

      单线程模式(SWOOLE_BASE) 这种模式就是传统的异步非阻塞Server。与Nginx和Node.js等程序是完全一致的。              (推荐学习: swoole视频教程) 在时间循环中直接回调PHP的函数,而不是dispatch投递任务。如果回调函数中有阻塞操作会导致Ser…

    2026年9月24日 用户投稿
    000
  • Android Management API:设备序列号获取疑难及解决方案

    Android Management API:设备序列号获取疑难及解决方案Android Management API:设备序列号获取疑难及解决方案Android Management API:设备序列号获取疑难及解决方案Android Management API:设备序列号获取疑难及解决方案

    本文旨在解决在使用 Android Management API 获取设备序列号时,部分设备无法提供序列号的问题。我们将深入探讨可能的原因,并提供一系列可行的解决方案,包括权限配置、代码优化以及通过 ADB shell 获取设备唯一标识的方法,帮助开发者更有效地管理 Android 设备。 权限配置…

    2026年9月24日 用户投稿
    300
  • MAC外接显示器没有反应_Mac外接显示器连接与故障排除

    首先检查连接线缆和接口是否正常,确认显示器电源及输入源设置正确;通过系统设置中的“检测显示器”功能强制识别;调整分辨率与刷新率为显示器兼容值;重置NVRAM/SMC以清除错误配置;使用安全模式排除软件冲突;最后更新macOS和显示器固件至最新版本。 如果您已将Mac连接至外接显示器,但屏幕显示“无信…

    2026年9月24日
    000
  • sublime的snippet(代码片段)怎么用_sublime代码片段创建与调用技巧

    sublime的snippet(代码片段)怎么用_sublime代码片段创建与调用技巧sublime的snippet(代码片段)怎么用_sublime代码片段创建与调用技巧sublime的snippet(代码片段)怎么用_sublime代码片段创建与调用技巧sublime的snippet(代码片段)怎么用_sublime代码片段创建与调用技巧

    输入触发词按Tab可快速插入代码。通过Tools > Developer > New Snippet创建,设置content、tabTrigger和scope,保存至Packages/User目录,使用$1、$2等定义光标位,支持多行与变量如文件名、选中内容,适用于JS等特定语言环境。 …

    2026年9月24日 用户投稿
    000
  • 小米17 AOD息屏显示可达500nits 可读性媲美iPhone 17

    小米17 AOD息屏显示可达500nits 可读性媲美iPhone 17小米17 AOD息屏显示可达500nits 可读性媲美iPhone 17小米17 AOD息屏显示可达500nits 可读性媲美iPhone 17小米17 AOD息屏显示可达500nits 可读性媲美iPhone 17

    9月29日,小米集团总裁卢伟冰再次揭晓了小米17系列的一项全新升级功能——aod息屏显示。 他介绍称,此次小米17系列在AOD息屏显示的亮度方面进行了显著优化,能够智能感应环境光并自动调节,最高亮度可达500nits。 卢伟冰强调,小米17系列在息屏状态下信息的可读性已达到与iPhone 17相同的…

    2026年9月24日 用户投稿
    200
  • 人渣SCUM传送代码怎么用 传送代码使用方法介绍

    人渣SCUM传送代码怎么用 传送代码使用方法介绍人渣SCUM传送代码怎么用 传送代码使用方法介绍人渣SCUM传送代码怎么用 传送代码使用方法介绍人渣SCUM传送代码怎么用 传送代码使用方法介绍

    在游戏《人渣SCUM》中,玩家可通过控制台输入特定指令实现快速传送,例如传送到指定坐标、其他玩家身边或特定载具附近。通常情况下,按下“T”键或“~”键即可打开控制台,输入相应代码后按回车键执行传送操作。具体使用方式如下: 1、查看当前坐标:输入“#Location”,屏幕上会显示角色当前所处位置的X…

    2026年9月24日 用户投稿
    000
  • 手机淘宝怎么上拍品?手机淘宝怎么上拍品视频

    手机淘宝怎么上拍品?手机淘宝怎么上拍品视频手机淘宝怎么上拍品?手机淘宝怎么上拍品视频手机淘宝怎么上拍品?手机淘宝怎么上拍品视频手机淘宝怎么上拍品?手机淘宝怎么上拍品视频

    首先打开手机淘宝进入“我是商家”,通过“发布宝贝”填写信息并上传图片完成商品发布;接着在“素材中心”上传不超过500MB的MP4格式视频,并将视频链接插入商品详情;也可使用千牛App,在发布商品时直接添加视频,确保封面清晰,最后提交发布即可。 如果您想在手机淘宝上发布商品或上传拍品视频,但不清楚具体…

    2026年9月24日 用户投稿
    200
  • 苹果手机x死机了关不了怎么办

    苹果手机x死机了关不了怎么办苹果手机x死机了关不了怎么办苹果手机x死机了关不了怎么办苹果手机x死机了关不了怎么办

    当 iPhone X 死机且无法关机,可尝试以下解决方法:强制重启:快速按下音量调高键、调低键,然后长按电源键约 10-15 秒。恢复模式:连接电脑,同时按住电源键和调低音量键约 10-15 秒,在 iTunes 中选择“恢复”。DFU 模式:连接电脑,依次按住电源键 3 秒、释放、调低音量键 10…

    2026年9月24日 用户投稿
    000
  • UC浏览器如何设置默认下载工具_UC浏览器调用第三方下载器设置方法

    UC浏览器如何设置默认下载工具_UC浏览器调用第三方下载器设置方法UC浏览器如何设置默认下载工具_UC浏览器调用第三方下载器设置方法UC浏览器如何设置默认下载工具_UC浏览器调用第三方下载器设置方法UC浏览器如何设置默认下载工具_UC浏览器调用第三方下载器设置方法

    首先开启UC浏览器的第三方下载权限,进入设置→下载设置→启用“使用第三方下载工具”;然后在默认下载工具中选择目标应用如IDM+或ADM;若未显示可选应用需确认安装并刷新列表;还可通过系统设置→应用管理→默认应用→下载管理器中指定默认下载器;对于不支持直接绑定的版本,可用Tasker或Auto.js等…

    2026年9月24日 用户投稿
    100
  • 苹果手机屏幕上的圆点怎么设置

    苹果手机屏幕上的圆点怎么设置苹果手机屏幕上的圆点怎么设置苹果手机屏幕上的圆点怎么设置苹果手机屏幕上的圆点怎么设置

    iPhone 屏幕上的圆点,名为“辅助触控”,可帮助用户更轻松地使用设备。设置圆点的步骤如下:1. 启用辅助触控;2. 自定义圆点;3. 放置圆点;4. 使用圆点;5. 其他设置(单点手势、双击手势、长按手势)。 如何设置 iPhone 屏幕上的圆点 iPhone 屏幕上的圆点是一个辅助功能,称为“…

    2026年9月24日 用户投稿
    400
  • 怎样备份和恢复Debian邮件服务器数据

    备份和恢复debian邮件服务器数据的方法取决于邮件服务器的具体配置和使用的软件。以下是一些通用的步骤和建议: 壁纸样机神器 免费壁纸样机生成 0 查看详情 备份步骤 确定备份内容:首先,确定需要备份的数据类型,例如邮件内容、用户信息、配置文件等。使用备份工具:根据邮件服务器的软件选择合适的备份工具…

    2026年9月24日
    100
  • 怎么用豆包AI帮我实现CQRS模式 3步教你用AI分离读写模型

    怎么用豆包AI帮我实现CQRS模式 3步教你用AI分离读写模型怎么用豆包AI帮我实现CQRS模式 3步教你用AI分离读写模型怎么用豆包AI帮我实现CQRS模式 3步教你用AI分离读写模型怎么用豆包AI帮我实现CQRS模式 3步教你用AI分离读写模型

    实现cqrs模式可通过三步借助豆包ai快速完成:一、理清业务场景,将写操作(如用户下单)与读操作(如查看订单列表)分离,可复制代码给豆包ai分析归类;二、让豆包ai生成基础结构代码,输入类似“基于cqrs的订单管理系统,用python flask实现”的指令,获取命令处理器、查询处理器等模块模板;三…

    2026年9月24日 用户投稿
    000
  • linux安装swoole有哪些前提条件

    linux安装swoole有哪些前提条件linux安装swoole有哪些前提条件linux安装swoole有哪些前提条件linux安装swoole有哪些前提条件

    linux下安装swoole的前提条件:(推荐: swoole视频教程) 执行 phpize ( 如果没有将php 加入到path 环境变量,写绝对路径 如: /usr/local/php/bin/phpize ) phpize phpize 命令是用来准备 PHP 扩展库的编译环境的 编译安装 可…

    2026年9月24日 用户投稿
    000
  • 远光84辅助英雄有哪些 辅助英雄推荐

    远光84辅助英雄有哪些 辅助英雄推荐远光84辅助英雄有哪些 辅助英雄推荐远光84辅助英雄有哪些 辅助英雄推荐远光84辅助英雄有哪些 辅助英雄推荐

    远光84里辅助角色在团队中扮演着不可或缺的支援角色,能够根据战场形势灵活调整策略,为队伍争取优势。游戏内辅助类型多样,各具特色。接下来为大家盘点几位表现突出的辅助英雄,想了解的玩家不妨继续往下看。 推荐的强力辅助英雄如下: 1、塞昂娜 团队中的“生命守护者”。她的被动技能可在队友阵亡时提供快速救援机…

    2026年9月24日 用户投稿
    900
  • 新建温州至福州高铁开工建设:设计时速 350 公里,建设工期 5 年

    新建温州至福州高铁开工建设:设计时速 350 公里,建设工期 5 年新建温州至福州高铁开工建设:设计时速 350 公里,建设工期 5 年新建温州至福州高铁开工建设:设计时速 350 公里,建设工期 5 年新建温州至福州高铁开工建设:设计时速 350 公里,建设工期 5 年

    感谢网友 坚守阵地 提供的线索!9 月 29 日消息,中国铁路正式发布,新建温州至福州高速铁路(简称“新建温福高铁”)已启动建设。 该线路起于杭深高铁乐清站,途经浙江省温州市,福建省宁德市、福州市,终至福厦高铁福州南站,正线全长约 303 公里,设计运行速度为 350 公里/小时,计划建设周期为 5…

    2026年9月24日 用户投稿
    000
  • win8如何关闭自动更新_Win8关闭自动更新教程

    win8如何关闭自动更新_Win8关闭自动更新教程win8如何关闭自动更新_Win8关闭自动更新教程win8如何关闭自动更新_Win8关闭自动更新教程win8如何关闭自动更新_Win8关闭自动更新教程

    通过控制面板将Windows更新设置为从不检查更新;2. 在服务管理中禁用Windows Update服务并停止其运行;3. 使用组策略编辑器(专业版)禁用自动更新策略,彻底阻止系统自动下载和安装更新。 如果您希望阻止Windows 8系统自动下载和安装更新,以避免占用网络带宽或防止在不适当的时间重…

    2026年9月24日 用户投稿
    000

发表回复

登录后才能评论
关注微信