C++设计模式---备忘录模式

1、介绍

        备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后将对象恢复到原先保存的状态。

该模式主要涉及三个角色:

        (1)发起人(Originator):这是需要保存和恢复状态的对象。发起人通常包含需要保存的状态数据,以及创建备忘录和从备忘录中恢复状态的方法。

        (2)备忘录(Memento):用于存储发起人对象状态的对象。备忘录通常具有访问状态数据的方法,但不能直接修改状态。

        (3)管理者(Caretaker):负责管理备忘录的对象。它可以保存多个备忘录对象,并提供对备忘录的访问,通常提供了保存和恢复状态的接口。

2、示例

#include <iostream>
#include <string>// 备忘录类,用于存储游戏角色的状态
class RoleStateMemento {
private:int m_vit;  // 生命力int m_atk;  // 攻击力int m_def;  // 防御力public:RoleStateMemento(int vit, int atk, int def) : m_vit(vit), m_atk(atk), m_def(def) {}// 设置生命力void setVitality(int vit) { m_vit = vit; }int getVitality() { return m_vit; }// 设置攻击力void setAttack(int atk) { m_atk = atk; }int getAttack() { return m_atk; }// 设置防御力void setDefense(int def) { m_def = def; }int getDefense() { return m_def; }
};// 发起人,即游戏角色
class GameRole {
private:int m_vit;  // 生命力int m_atk;  // 攻击力int m_def;  // 防御力public:// 保存角色状态,返回备忘录对象RoleStateMemento* saveState() {return new RoleStateMemento(m_vit, m_atk, m_def);}// 恢复角色状态,根据备忘录对象设置角色状态void recoverState(RoleStateMemento* memento) {m_vit = memento->getVitality();m_atk = memento->getAttack();m_def = memento->getDefense();}// 获取初始状态void getInitState() {m_atk = m_def = m_vit = 100;}void fight() {m_atk = m_def = m_vit = 0;}void stateDisplay() {std::cout << "角色当前状态:" << std::endl;std::cout << "体力:" << m_vit << " "<< "攻击力:" << m_atk << " "<< "防御力:" << m_def << std::endl;}
};// 管理者,用于管理备忘录对象
class RoleStateCaretaker {
private:RoleStateMemento* m_memento;public:~RoleStateCaretaker() {delete m_memento;}void setMemento(RoleStateMemento* memento) {m_memento = memento;}RoleStateMemento* getMemento() {return m_memento;}
};int main() {// 大战 boss 前GameRole* lixiaoyao = new GameRole;lixiaoyao->getInitState();lixiaoyao->stateDisplay();// 保存进度RoleStateCaretaker* stateAdmin = new RoleStateCaretaker;stateAdmin->setMemento(lixiaoyao->saveState());// 大战 boss 时,损耗严重lixiaoyao->fight();lixiaoyao->stateDisplay();// 恢复之前状态lixiaoyao->recoverState(stateAdmin->getMemento());lixiaoyao->stateDisplay();delete lixiaoyao;delete stateAdmin;return 0;
}

结果:

角色当前状态:
体力:100 攻击力:100 防御力:100
角色当前状态:
体力:0 攻击力:0 防御力:0
角色当前状态:
体力:100 攻击力:100 防御力:100

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端直连小票打印机,前端静默打印,js静默打印解决方案

最近公司开发了一个vue3收银系统&#xff0c;需要使用小票打印机打印小票&#xff0c;但是又不想结账的时候弹出打印预览&#xff0c;找了很多方案&#xff0c;解决不了js打印弹出的打印预览窗口&#xff01; 没办法&#xff0c;自己写了一个winform版本的静默打印软件&#xf…

面试真题 | 操作系统中断知识

操作系统中断知识 什么是中断&#xff1f;在嵌入式系统中&#xff0c;为什么中断很重要&#xff1f; 参考答案 中断是计算机系统中的一种机制&#xff0c;用于在当前执行的程序或任务被中断处理程序&#xff08;Interrupt Service Routine&#xff0c;ISR&#xff09;中断执行时…

【鸿蒙学习笔记】Stage模型

官方文档&#xff1a;Stage模型开发概述 目录标题 Stage模型好处Stage模型概念图ContextAbilityStageUIAbility组件和ExtensionAbility组件WindowStage Stage模型-组件模型Stage模型-进程模型Stage模型-ArkTS线程模型和任务模型关于任务模型&#xff0c;我们先来了解一下什么是…

鸿蒙语言基础类库:【@ohos.util.ArrayList (线性容器ArrayList)】

线性容器ArrayList 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

Oracle 确认被锁对象

1. 被锁Session查询 --被锁Session SELECT GV$SESSION.SID, GV$SESSION.SERIAL#,DBA_OBJECTS.OBJECT_NAME,GV$SESSION.OSUSER,GV$SESSION.PROGRAM FROM GV$LOCKED_OBJECT LEFT JOIN DBA_OBJECTS ON GV$LOCKED_OBJECT.OBJECT_ID DBA_OBJECTS.OBJECT_ID LEFT JOIN GV$SESSION …

基于Java中的SSM框架实现疫情冷链追溯系统项目【项目源码+论文说明】

基于Java中的SSM框架实现疫情冷链追溯系统演示 摘要 近几年随着城镇化发展和居民消费水平的不断提升&#xff0c;人们对健康生活方式的追求意识逐渐加强&#xff0c;生鲜食品逐渐受到大众青睐&#xff0c;诸如盒马鲜生、7-fresh等品牌生鲜超市&#xff0c;一时间如雨后春笋般迅…

合合信息大模型加速器重磅上线,释放智能文档全新可能

目录 0 写在前面1 高速文档解析引擎&#xff1a;拓宽大模型认知边界2 文本嵌入模型acge&#xff1a;克服大模型感知缺陷3 行业赋能&#xff1a;以百川智能为例总结 0 写在前面 随着人工智能技术的飞速发展&#xff0c;大模型以强大的数字处理能力和深度学习能力&#xff0c;不…

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

java使用poi-tl模版引擎导出word之if判断条件的使用

文章目录 模版中if语句条件的使用1.数据为False或空集合2.非False或非空集合 模版中if语句条件的使用 如果区块对的值是 null 、false 或者空的集合&#xff0c;位于区块中的所有文档元素将不会显示&#xff0c;这就等同于if语句的条件为 false。语法示例&#xff1a;{{?stat…

openFileInput 内部保持的数据如何删除

在Android中&#xff0c;openFileInput 是用于从设备内部存储中读取文件的API&#xff0c;但它本身并不提供直接删除文件的功能。要删除通过 openFileInput 读取的文件&#xff0c;你需要使用其他方法。以下是如何删除内部存储中文件的步骤和说明&#xff1a; 步骤 获取文件路…

Python库 - PyMC3

PyMC3 是一个用于概率编程和贝叶斯统计建模的Python库。它提供了一种灵活且强大的方式来构建复杂的概率模型. 主要特点 概率编程&#xff1a;PyMC3允许用户通过Python代码定义概率模型&#xff0c;包括随机变量、概率分布和条件依赖关系。贝叶斯推断&#xff1a;PyMC3支持多种…

视图库对接系列(GA-T 1400)十四、视图库对接系列(本级)新增、修改订阅

说明 之前我们已经对接的设备,设备的话比较简单,是设备主动推送数据到平台的。 相信大家已经会了,那今天开始的话,我们来做对接平台,相对难点点。 但搞懂了核心的订阅流程的话,其实就不难了。 对接平台 订阅接口 订阅接口的话,有几个,添加、查询、更新、删除、取消…

Centos解决服务器时间不准的问题

CentOS 系统时间老是自己变化可能有以下几个原因&#xff1a; 硬件时钟问题&#xff1a;服务器的硬件时钟可能出现故障或不准确。 时区设置错误&#xff1a;如果时区设置不正确&#xff0c;可能导致显示的时间与实际期望的时间不符。 系统服务异常&#xff1a;与时间同步相关…

Linux镜像源设置不再难:一键脚本,新手也能成为优化高手(一键切换镜像源/Docker一键安装脚本)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 更换镜像源 📒📝 一键切换软件源📝 Docker一键安装脚本⚓️ 相关链接 ⚓️📖 介绍 📖 在国内,Linux系统用户经常会遇到下载软件包时速度慢的问题,这通常是因为默认的镜像源并不总是最优选择。对于新手来说,手动设置…

亚马逊速卖通卖家必看:自养号测评策略,下单高效防关联全攻略

在跨境电商的激烈竞争中&#xff0c;自养号测评策略已成为众多卖家追求低成本、高效推广的优选路径。然而&#xff0c;其成功实施离不开一系列精心策划与严格执行的关键要素。以下是对这些核心条件的深入剖析&#xff0c;旨在指导您安全、有效地构建并运营自养号测评体系。 一、…

Git: fatal: cannot lock ref‘HEAD‘: Unable to create

删除锁文件 并且你确信没有其他Git进程正在运行&#xff0c;可能是因为某个Git进程在之前异常终止&#xff0c;留下了锁文件。这些文件通常位于.git目录的某个子目录中&#xff0c;如.git/index.lock、.git/refs/heads/master.lock&#xff08;如果分支名不是master&#xff0…

【内网渗透】MSF渗透阶段的常用指令笔记

目录 渗透阶段划分 msfvenom 常用参数 各平台生成payload命令 Meterpreter Meterpreter的常用命令 基本命令 常用命令 针对安卓手机的一些命令 针对Windows的一些命令 文件系统命令 生成木马反弹shell(以linux靶机为例) 木马生成 配置监控 攻击利用 渗透阶段划分…

从零开学C++:入门

引言&#xff1a;经过C语言和数据结构等编程知识的洗礼&#xff0c;到了暑假&#xff0c;我们就将要踏上C编程语言的学习了&#xff0c;C的学习难度比python等其他语言的学习难度更大&#xff0c;但是我们已经熟练地掌握了C语言的知识&#xff0c;相信学习起来C应该还是会简单许…

「typescript」Typescript 的基础类型有哪些

TypeScript 是一种强类型编程语言&#xff0c;它建立在 JavaScript 的基础上&#xff0c;为开发者提供了更丰富的类型系统和更严格的编译时检查。TypeScript 的基础类型主要包括以下几种&#xff1a; 布尔类型&#xff08;Boolean&#xff09;&#xff1a; 表示逻辑值&#xff…

什么是软件定义安全SDSec

一、软件定义安全SDSec产生的背景 软件定义安全&#xff08;Software Defined Security&#xff0c;SDSec&#xff09;的产生背景主要源于传统网络安全防护方法在面对复杂网络环境时的不适应性&#xff0c;以及软件定义网络&#xff08;SDN&#xff09;技术的发展和应用。 SD…