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

运行在VS2022,x86,Debug下。

28. 状态模式

在这里插入图片描述

  • 状态模式让一个对象的行为随着内部状态的改变而改变,而该对象也像换了类一样。
  • 应用:如在游戏开发中,游戏有不同场景,如主菜单、开始、战斗等。可以使用状态模式,定义一个场景状态接口, 然后分别实现主菜单状态类、开始状态类、战斗状态类,实现游戏场景的切换。
  • 实现
    • 抽象状态类,即定义状态接口。
    • 具体状态类,即实现状态接口。
    • 上下文类,状态控制者。
  • 代码如下。
//抽象状态类:场景状态接口
class SceneState
{
public:
    virtual void load() = 0;
    virtual void update() = 0;
    virtual void render() = 0;
    virtual void unload() = 0;
};

//具体状态类:主菜单状态类
class MainMenuState :public SceneState
{
public:
    void load() { cout << "Loading main menu..." << endl; }
    void update() { cout << "Updating main menu..." << endl; }
    void render() { cout << "Rendering main menu..." << endl; }
    void unload() { cout << "Unloading main menu..." << endl; }
};

//具体状态类:战斗状态类
class BattleState :public SceneState
{
public:
    void load() { cout << "Loading battle scene..." << endl; }
    void update() { cout << "Updating battle scene..." << endl; }
    void render() { cout << "Rendering battle scene..." << endl; }
    void unload() { cout << "Unloading battle scene..." << endl; }
};

//上下文类,状态控制者
class Context 
{
private:
    SceneState* currentState; //保存当前状态

public:
    Context(SceneState* initialState):currentState(initialState){}

    void setState(SceneState* state) //切换状态
    {
        if (currentState) currentState->unload(); //切换状态前先卸载当前状态

        currentState = state;
        state->load();  //加载新状态
    }

    void update() {  currentState->update(); }

    void render() {currentState->render(); }
    
};

int main()
{
    MainMenuState mainMenu;
    BattleState batteScene;

    //从主菜单场景切换到战斗场景
    Context context(&mainMenu); 
    context.render();
   
    context.setState(&batteScene);
    context.update();
    context.render(); 

    return 0;
}

注意 虽然策略模式和状态模式看起来很像,但是关注点不同。

  • 状态模式强调对象状态和行为之间的关联。
  • 策略模式强调算法之间的独立性和可互换性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/670903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Debian系统磁盘挂载

服务器推荐&#xff1a;雨云 优惠码&#xff1a;zsj 用优惠码注册账户并绑定微信后可获取首月5折优惠券&#xff1b; 后续新购主机也可在积分商城中换取新购优惠券&#xff1b; 公测阶段的超大带宽服务器&#xff0c;由于是国内主机因此需要备案域名。 公测阶段价格尚未确定&am…

【Modelground】个人AI产品MVP迭代平台(2)——网站从0-1部署教程

文章目录 1.选购一台云服务器2. 购买域名3. 通过nginx部署静态网站4. 通过gitee在云服务器拉取代码5. ICP备案总结 1.选购一台云服务器 目前阿里云在促销&#xff0c;一台2核2GB内存3Mbps宽带的云服务器&#xff0c;一年只需要99元&#xff0c;学生更便宜&#xff0c;我认为这…

没有知网资源如何快速下载知网论文

今天有位同学求助一篇知网论文&#xff0c;“球磨-点击化学反应&#xff1a;无溶剂绿色反应方式”&#xff0c;其实下载知网论文是一件非常简单的事情&#xff0c;下面小编就把如何在家轻松查找下载知网论文的方法给大家演示一遍。 一、首先你需要获取知网使用权限&#xff0c…

【R语言入门】 在Anaconda Navigator平台使用R语言编程

R语言入门 - 在Anaconda Navigator平台使用R语言编程 R Essentials - Using R Programming Language on Anaconda Navigator Platform By JacksonML 02/06/2024 1. 安装Anaconda Navigator 为了持续研究数据科学&#xff0c;笔者一开始就在电脑上安装了Jupyter Notebook&am…

ad18学习笔记21:焊盘设置Paste Mask Expansion(锡膏层延伸)

在pcb上放置焊盘的时候&#xff0c;可以对焊盘进行设置&#xff0c;可以用默认的规则&#xff0c;可以用自定义的规则&#xff0c;网上很少看到自定义的规则怎么用。 参考了官方的说明文档&#xff0c;我只是稍微补充了一下 paste mask与solder mask有哪些区别_paste mask与s…

【MySQL数据库】索引与事务

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 目录 &#x1f5f3;️一.索引 &#x1f4ee;1.工作原理 &#x1f4ec;2.类型 &#x1f4ed;3.作用 &#x1f4ea;4.优缺点 &#x1f4eb;5.使用…

Mamba In-2.Vision Mamba公式推导

Vision Mamba 从公式推导切入&#xff0c;介绍一下Vision Mamba&#xff0c;论文的第一个公式中表达了连续状态空间方程 在之后加入 步长∆后&#xff0c;h(t∆)如何表示呢&#xff1f; 可以在h(t)处做一个切线&#xff0c;此时的h(t∆)就由红色加蓝色的虚线相加得到了。那蓝…

详解 Spark 核心编程之累加器

累加器是分布式共享只写变量 一、累加器功能 ​ 累加器可以用来把 Executor 端的变量信息聚合到 Driver 端。在 Driver 程序中定义的变量&#xff0c;在 Executor 端的每个 Task 都会得到这个变量的一份新的副本&#xff0c;每个 task 更新这些副本的值后&#xff0c;传回 Dri…

制作ChatPDF之前端Vue搭建(二)

前端界面 接上篇: 制作ChatPDF之Elasticsearch8.13.4搭建&#xff08;一&#xff09; 为了实现一个基于 Vue.js 的前端应用&#xff0c;用户可以上传 PDF 文件&#xff0c;输入查询&#xff0c;并在输出框中显示查询结果&#xff0c;你需要以下步骤&#xff1a; 初始化 Vue …

Vue3实战笔记(59)—从零开始掌握Vue3插槽机制,进阶与提高

文章目录 前言一、具名插槽二、高级列表组件示例总结 前言 接上文&#xff0c;接下来看一点稍微复杂的&#xff1a;具名插槽 一、具名插槽 子组件 MyComponent.vue&#xff1a; <template><div><slot name"header"></slot><slot><…

LeetCode162寻找峰值元素

题目描述 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] nums[n] -∞ 。你必须实现时间复杂度为…

How to install a dataset from huggingface?

当我从抱抱脸上git clone imdb数据集时&#xff0c;plain_text里的文件是这样的&#xff1a;

FPGA新起点V1开发板(九)——流水灯

文章目录 一、模块框图二、代码编写三、注意点四、总结 一、模块框图 二、代码编写 endmodule下面需要敲出一个回车代码拼接是大括号 led < {led[2:0],led[3]}注意二进制和十进制 module flow_led(input sys_clk50,input rst_n,output reg [3:0] le…

双指针练习:盛水最多的容器

题目链接&#xff1a;11.盛水最多的容器 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可…

# linux 系统下,使用 docker 启动 mysql 后,通过 sqlyog 连接 mysql 报“错误号码2058“

linux 系统下&#xff0c;使用 docker 启动 mysql 后&#xff0c;通过 sqlyog 连接 mysql 报“错误号码2058“ 一、错误描述&#xff1a; 在 ubuntu 系统上&#xff0c;刚安装的 docker 启动 mysql 后&#xff0c;想通过图形界面 SQLyong 等工具连接 mysql 出现“错误号码2058…

算法题-给定一个日期,输出星期几

目录 给定日期&#xff0c;输出对应是星期几 测试结果 如1900年 5月6日是星期三&#xff0c;计算给的日期是星期几 给定日期&#xff0c;输出对应是星期几 #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {char input[100];int d…

【Python技术】AI编程新手快速入门学习LangChain大模型框架

如果我们要搞AI智能体&#xff0c;普通人一般 借助腾讯元器、 coze、KIMI 或者其他大平台搞一搞&#xff0c;比如我配置的coze智能体在微信公众号聊天。 对于程序员来说&#xff0c;一言不合就喜欢搞代码。 前面文章也介绍了不少关于AI知识库问答&#xff0c;AIagent 不少开源…

STM32基于HAL库的HC-SR04模块超声波测距

文章目录 一、HC-SR04模块介绍二、创建工程1.选择芯片2.配置RCC、SY![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9d2a5b883f0e409eabb804e6da861277.png)3.配置串口14.配置定时器5.配置GPIO 三、Keil代码1.勾选Use MicroLIB2.创建SR04.c和SR04.h文件3.其他代码 …

钣金件设计规范

(一&#xff09; 钣金 1、钣金的概念 钣金&#xff08;sheet metal&#xff09;是针对金属薄板&#xff08;厚度通常在6mm以下&#xff09;的 一种综合冷加工工艺&#xff0c;包括冲裁、折弯、拉深、成形、锻压、铆合等&#xff0c; 其显著的特征是同一零件厚度一致。 2、钣…

使用 Ollama 本地运行各种 LLM

今天看看另外一个产品Ollama。Ollama 的安装非常简单&#xff0c;只需从官网&#xff08;https://ollama.com/download&#xff09;下载后解压缩&#xff0c;并在 Terminal 中运行脚本 ollama run llama3 即可完成环境设置。 我尝试运行 Llama3&#xff0c;虽然在运行时占用了大…