C++ 设计模式(五)——状态模式

状态模式

  • 序言
  • 理解
  • 源码

序言

设计模式只是一个抽象的设计模式方法,并不是一个固定使用的搭配,就算是普通switch语句,Map,乃至状态机都是状态模式的其中一种实现方法

状态模式看起来好像和策略模式差不多,主要是其的侧重点不一样:

  1. 状态模式:适用于当对象的行为取决于它的状态时,以及需要在运行时根据状态改变对象的行为时。
  2. 策略模式:适用于当有多种算法需要实现,并且这些算法可以相互替换时,或者当算法的实现需要频繁变化时。
    .

理解

Employee持有State的父类接口,通过切换不同继承的State实体,运行统一实现的接口,即可根据当前Employee持有的State,运行因State不同的不同方法。
在这里插入图片描述
.

源码

State.h

class State
{
public:/*** @brief 产出率计算* @return*/virtual int yieldsCalculation() const = 0;
};class HungerState : public State
{
public:virtual int yieldsCalculation() const;
};class HappyState : public State
{
public:virtual int yieldsCalculation() const;
};class GrievanceState : public State
{
public:virtual int yieldsCalculation() const;
};

State.cpp

int HungerState::yieldsCalculation() const
{return 40;
}int HappyState::yieldsCalculation() const
{return 120;
}int GrievanceState::yieldsCalculation() const
{return 20;
}

.
Employee.h

class Employee
{
public:Employee();void switchHungerState();void switchHappyState();void switchGrievanceState();int yieldsCalculation() const;private:std::unique_ptr< State > m_state;
};

Employee.cpp

Employee::Employee()
{}void Employee::switchHungerState()
{m_state.reset(new HungerState);
}void Employee::switchHappyState()
{m_state.reset(new HappyState);
}void Employee::switchGrievanceState()
{m_state.reset(new GrievanceState);
}int Employee::yieldsCalculation() const
{if (m_state)return m_state->yieldsCalculation();elsereturn 0;
}

.
使用地方:

Employee ctx;
ctx.switchHungerState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;ctx.switchHappyState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;ctx.switchGrievanceState();
std::cout << "yields: " << ctx.yieldsCalculation() << std::endl;

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

企业快速获客-AI机器人批量筛选

那么企业利用AI机器人进行快速获客和批量筛选时&#xff0c;可以遵循以下步骤和策略&#xff0c;以确保高效、准确地获取目标客户&#xff1a; 1. 明确筛客需求 - 企业首先需要明确自身的筛客需求&#xff0c;例如筛选目标客户群、快速识别意向客户等。 - 明确需求有助于…

领夹麦克风哪个品牌好,电脑麦克风哪个品牌好,热门麦克风推荐

​在信息快速传播的时代&#xff0c;直播和视频创作成为了表达与交流的重要方式。对于追求卓越声音品质的创作者而言&#xff0c;一款性能卓越的无线麦克风宛如一把利剑。接下来&#xff0c;我要为大家介绍几款备受好评的无线麦克风&#xff0c;这些都是我在实际使用中体验良好…

ocrbench:on the hidden mystery of ocr in large multimodel models

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准-CSDN博客文章浏览阅读1.9k次,点赞26次,收藏22次。本文主要介绍 OCRBench_ocrbenchhttps://blog.csdn.net/jiaoyangwm/article/details/138414709OpenCompass司南 - 评测榜单评测榜单旨在为大语言模型和多…

项目实战--C#实现图书馆信息管理系统

本项目是要开发一个图书馆管理系统&#xff0c;通过这个系统处理常见的图书馆业务。这个系统主要功能是&#xff1a;&#xff08;1&#xff09;有客户端&#xff08;借阅者使用&#xff09;和管理端&#xff08;图书馆管理员和系统管理员使用&#xff09;。&#xff08;2&#…

C++如何在main函数开始之前(或结束之后)执行一段逻辑?

1. 问题2. 考察的要点3. 解决策略 3.1. 方案一&#xff1a;使用GCC的拓展功能3.2. 方案二&#xff1a;使用全局变量3.3. 方案三&#xff1a;atexit 4. Demo测试 4.1. 测试代码4.2. 执行结果 5. 程序异常退出场景 5.1. 存在的问题5.2. 解决方案 5.2.1. 原理5.2.2. 示例代码5.2.3…

定义限流和降级后的处理⽅法(Sentinel)

SentinelResource的使用 在定义了资源点之后&#xff0c;我们可以通过 Dashboard 来设置限流和降级策略来对资源点进⾏保护。同时还能通过 SentinelResource 来指定出现异常时的处理策略。 SentinelResource ⽤于定义资源&#xff0c;并提供可选的异常处 理和 fallback 配置项…

Qt5--设置QCustomPlot

在你程序中使用QCustomPlot非常简单&#xff1a; 从下载部分获取QCustomPlot的最新版本。像任何其它常规的类文件一样使用qcustomplot.h和qcustomplot.cpp。 对于QtCreator用户 在左侧边栏中你项目的根项目上右击并且选择Add Existing Files... 在出现的文件对话框中&#xf…

成都云飞浩容文化传媒有限公司是真的吗?

在当今这个数字化浪潮汹涌的时代&#xff0c;电商行业无疑是众多行业中的一颗璀璨明星。作为这个行业的佼佼者&#xff0c;成都云飞浩容文化传媒有限公司凭借其专业的电商服务&#xff0c;已经帮助无数企业和个人在电商领域取得了令人瞩目的成绩。 成都云飞浩容文化传媒有限公…

Android 性能之刷新率设置和管理

目录 1. 刷新率和帧率 2. 多种刷新率 3. 基本原理 3.1 屏幕 & 显示控制器 3.2 Composer Service 4. Framework 策略 4.1基本架构 4.2 刷新率设置项的定义 4.2.1 最低刷新率 4.2.2 默认刷新率 & 默认的用户设置刷新率 4.2.2.1 设置入口 4.2.2.2 设置场景 4…

SmartX 超融合 vs vSAN 8:数据库场景下的性能对比

此前&#xff0c;我们以 vSAN 7 为例&#xff0c;对比了 SmartX 与 VMware 超融合在快照、缓存、I/O 路径上的技术差异&#xff0c;及其带来的性能影响。不同于 vSAN 7&#xff0c;vSAN 8 引入了快速存储架构 ESA&#xff08;Express Storage Architecture&#xff09;&#xf…

企业私有云的部署都有哪些方式?

如今常见的企业私有云的部署方式有自建私有云、托管私有云、虚拟私有云、混合云、容器化私有云、本地数据中心部署等。如今&#xff0c;企业私有云的部署呈多样化趋势&#xff0c;以用来满足各个企业的具体需求。以下是RAK部落小编为大家汇总的企业私有云常见的部署方式&#x…

Visual Studio调试Web项目

一、编译运行调试&#xff08;VS快捷键&#xff1a;CtrlF5&#xff09; 缺点&#xff1a;编译运行项目太慢&#xff0c;整体程序有些编译报错运行不了 二、附加到进程调试&#xff08;VS快捷键&#xff1a;CtrlAltP&#xff0c;选择w3wp.exe&#xff09; 无需编译&#xff0c;速…

如何在WeMapEngine中加载显示地图

我们在《全新跨平台GIS引擎将问世》一文中&#xff0c;为你分享了我们自主研发了一款全新跨平台的国产化GIS引擎——WeMapEngine。 现在再为你分享一下&#xff0c;如何在WeMapEngine中加载地图服务的方法&#xff0c;不过该产品暂未发布&#xff0c;因此暂时还无法立即体验。…

HormonyOs之 路由简单跳转

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行&#xff0c;每个Navigation都需要创建并传入一个NavPathStack对象&#xff0c;用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。 Entry Component struct Index …

Spring -- 三层架构

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 应用分层 介绍 在阿里的开发手册里,关于工程结构部分,定义的常见工程的应用分层结构 那么什么是应用分层呢? 应用分层是一种软件开发设计思想,他将应用程序分层N个层次.这N个层次分别负责各…

vue3【详解】内置组件 Transition

用于给元素或组件进入和离开页面添加过渡动画 使用场景 v-if 切换 <button click"show !show">Toggle</button> <Transition><p v-if"show">hello</p> </Transition>v-show 切换 动态组件切换 <Transition name&…

Adobe国际认证详解-ae视频剪辑

AE视频剪辑&#xff0c;即After Effects视频剪辑&#xff0c;是数字媒体时代的一项重要技能。AE不仅提供了丰富的特效和动画功能&#xff0c;还让视频剪辑变得更加高效和有趣。对于想要在职场上脱颖而出、拓宽就业机遇的人来说&#xff0c;掌握AE视频剪辑技能无疑是一个明智的选…

小程序基础总结

组件标签 html wxml div span img a view text image navigator css wxss rpx 小程序响应式单位,在不同设备上自动进行换算 js app.js 项目入口文件 ,通过App()函数启动整个小程序 页面的 .js ,页面入口文件,通过Page()函数创建运行页面 通信模型 渲染层 逻辑层 第三方…

Q*s‘ AGI

最近这段时间&#xff0c;不论是产业界还是学术界&#xff0c;均发表了不少围绕「Q*」的探索和实验&#xff0c;同时随着OpenAI的「草莓QQ糖(皮一下)」计划的曝光与训练的进行&#xff0c;似乎又为当前围绕Q*、AGI、AI4S等领域带来了不少业界争鸣和讨论&#xff0c;而且周围更多…

Electron案例解析——切换主题颜色的案例

效果图 核心 Electron的 nativeTheme.themeSource属性&#xff0c;值是string。有三个参数&#xff1a;system, light 和 dark&#xff0c;用来覆盖、重写Chromium内部的相应的值 Election的api描述值nativeTheme.themeSource被用来覆盖、重写Chromium内部的相应的值system, …