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

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

文章目录

  • 28. 状态模式

运行在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;
}

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

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

相关文章:

  • 【文件fd】回顾C语言文件操作 | 详细解析C语言文件操作写w追加a | 重定向和“w““a“
  • HOW - BFF 服务实践系列(一)
  • 探索Python机器学习:从基础到实践
  • Java基础入门day62
  • 【云原生】Kubernetes----POD控制器
  • 编程学习技巧——实战
  • 对boot项目拆分成cloud项目的笔记
  • 如何实现一个AI聊天功能
  • 智能超越了科技,更是一个复杂系统
  • 2024年5月31日 (周五) 叶子游戏新闻
  • Linux学习笔记(清晰且清爽)
  • Streamsets-JDBC模式使用更新时间字段数据同步
  • 6/1 第十五届蓝桥杯国赛pb组 真题本人答案 仅供参考
  • AJAX基础知识
  • Java大厂面试题第2季
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript类型识别
  • JS 面试题总结
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js面向对象
  • SpringCloud集成分布式事务LCN (一)
  • VUE es6技巧写法(持续更新中~~~)
  • 安卓应用性能调试和优化经验分享
  • 初识MongoDB分片
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端性能优化——回流与重绘
  • 数据结构java版之冒泡排序及优化
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 一个JAVA程序员成长之路分享
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 智能合约Solidity教程-事件和日志(一)
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​业务双活的数据切换思路设计(下)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (zt)最盛行的警世狂言(爆笑)
  • (二)JAVA使用POI操作excel
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (区间dp) (经典例题) 石子合并
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)重识new
  • (转载)(官方)UE4--图像编程----着色器开发
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net IE10 _doPostBack 未定义
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?