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

《C++新经典设计模式》之第18章 备忘录模式

《C++新经典设计模式》之第18章 备忘录模式

        • 备忘录模式.cpp

备忘录模式.cpp
#include <iostream>
#include <vector>
#include <memory>
using namespace std;// 保存对象内部状态,必要时恢复
// 在不破坏封装性的前提下,捕获对象的内部状态并保存,之后可将对象恢复到原先保存的状态
// 3种角色
// Originator(原发器),普通业务类,可以创建备忘录用于保存其当前的内部状态,之后用备忘录恢复内部状态
// Memento(备忘录),存储原发器对象某个瞬间的内部状态
// CareTaker(负责人/管理者),保存和传递备忘录,不知道备忘录细节,不能检查或操作备忘录namespace ns1
{class FighterMemento // 玩家主角相关的备忘录类{friend class Fighter; // 友元类Fighter可以访问本类的私有成员函数// 玩家主角类中要保存起来的数据,就放到这里来int m_life;   // 生命值int m_magic;  // 魔法值int m_attack; // 攻击力private: // 构造函数,用private修饰以防止在外部被随意创建FighterMemento(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) {}private: // 提供一些供Fighter类来访问的接口,用private修饰防止被任意类访问int getLife() const { return m_life; }void setLife(int life) { m_life = life; }int getMagic() const { return m_magic; }void setMagic(int magic) { m_magic = magic; }int getAttack() const { return m_attack; }void setAttack(int attack) { m_attack = attack; }};class Fighter     // 玩家主角类{                 // 角色属性int m_life;   // 生命值int m_magic;  // 魔法值int m_attack; // 攻击力public:Fighter(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) {}public: // 将玩家数据写入备忘录(创建备忘录,并在其中存储了当前状态)shared_ptr<FighterMemento> createMomento() const{shared_ptr<FighterMemento> back(new FighterMemento(m_life, m_magic, m_attack));return back;// return make_shared<FighterMemento>(m_life, m_magic, m_attack);}void restoreMomento(const shared_ptr<FighterMemento> &pfm) // 从备忘录中恢复玩家数据{m_life = pfm->m_life; // 友元类m_magic = pfm->getMagic();m_attack = pfm->getAttack();}void setToDead() { m_life = 0; } // 为测试目的引入的接口,设置玩家的生命值为0(玩家死亡)void displayInfo() const         // 用于输出一些信息{cout << "The player's current HP, magic and attack power are respectively " << m_life << ", " << m_magic << ", " << m_attack << endl;}};class FCareTaker // 管理者(负责人)类{shared_ptr<FighterMemento> m_pfm; // 指向备忘录对象的指针public:FCareTaker(const shared_ptr<FighterMemento> &ptmpfm = nullptr) : m_pfm(ptmpfm) {} // 形参是指向备忘录对象的指针shared_ptr<FighterMemento> getMemento() const { return m_pfm; }                   // 获取指向备忘录对象的指针void setMemento(const shared_ptr<FighterMemento> &ptmpfm) { m_pfm = ptmpfm; }     // 保存指向备忘录对象的指针};class FCareTaker2 // 支持多个快照的负责人(管理者)类{vector<shared_ptr<FighterMemento>> m_pfmContainer; // 存储备忘录对象指针的容器public:void push(const shared_ptr<FighterMemento> &ptmpfm) { m_pfmContainer.emplace_back(ptmpfm); } // 保存指向备忘录对象的指针shared_ptr<FighterMemento> pop(){if (m_pfmContainer.empty())return nullptr;return m_pfmContainer.back();}shared_ptr<FighterMemento> getMemento(int index) const // 获取指向备忘录对象的指针{if (index >= 0 && index < m_pfmContainer.size())return m_pfmContainer[index];return nullptr;}};
}int main()
{
#if 0using namespace ns1;shared_ptr<Fighter> p_fighter(new Fighter(800, 200, 300));// (1)显示玩家主角在与BOSS战斗之前的信息p_fighter->displayInfo();// (2)为玩家主角类对象创建一个备忘录对象(其中保存了当前主角类对象中的必要信息)shared_ptr<FighterMemento> p_fighterMemo = p_fighter->createMomento();// (3)玩家与BOSS开始战斗cout << "The protagonist of the player and BOSS began to fight fiercely------" << endl;p_fighter->setToDead();   // 玩家主角在与BOSS战斗中,生命值最终变成0而死亡(被BOSS击败)p_fighter->displayInfo(); // 显示玩家主角在与BOSS战斗之后的信息// (4)因为在与BOSS战斗之前已经通过NPC保存了游戏进度,这里模拟载入游戏进度,恢复玩家主角类对象的数据,让其可以与BOSS再次战斗cout << "Players recover their information through memos------" << endl;p_fighter->restoreMomento(p_fighterMemo);p_fighter->displayInfo(); // 显示玩家主角通过备忘录恢复到战斗之前的信息
#endif#if 0using namespace ns1;shared_ptr<Fighter> p_fighter(new Fighter(800, 200, 300));// (1)显示玩家主角在与BOSS战斗之前的信息p_fighter->displayInfo();// (2)为玩家主角类对象创建一个备忘录对象(其中保存了当前主角类对象中的必要信息)shared_ptr<FCareTaker> pfcaretaker(new FCareTaker(p_fighter->createMomento()));// (3)玩家与BOSS开始战斗cout << "The protagonist of the player and BOSS began to fight fiercely------" << endl;p_fighter->setToDead();   // 玩家主角在与BOSS战斗中,生命值最终变成0而死亡(被BOSS击败)p_fighter->displayInfo(); // 显示玩家主角在与BOSS战斗之后的信息// (4)因为在与BOSS战斗之前已经通过NPC保存了游戏进度,这里模拟载入游戏进度,恢复玩家主角类对象的数据,让其可以与BOSS再次战斗cout << "Players recover their information through memos------" << endl;p_fighter->restoreMomento(pfcaretaker->getMemento());p_fighter->displayInfo(); // 显示玩家主角通过备忘录恢复到战斗之前的信息
#endif#if 1using namespace ns1;shared_ptr<Fighter> p_fighter2(new Fighter(800, 200, 300));shared_ptr<FCareTaker2> pfcaretaker2(new FCareTaker2());pfcaretaker2->push(p_fighter2->createMomento()); // 做第一次快照吗,此快照玩家生命值为800p_fighter2->setToDead();                         // 改变玩家主角的生命值pfcaretaker2->push(p_fighter2->createMomento()); // 做第二次快照,此快照玩家生命值为0p_fighter2->displayInfo();                       // 玩家主角生命值应该为0cout << "------------------" << endl;// 当前玩家生命值为0,恢复第一次快照,也就是恢复玩家生命值为800p_fighter2->restoreMomento(pfcaretaker2->getMemento(0));p_fighter2->displayInfo(); // 玩家主角生命值应该恢复为800
#endifcout << "Over!\n";return 0;
}

相关文章:

《C++新经典设计模式》之第18章 备忘录模式

《C新经典设计模式》之第18章 备忘录模式 备忘录模式.cpp 备忘录模式.cpp #include <iostream> #include <vector> #include <memory> using namespace std;// 保存对象内部状态&#xff0c;必要时恢复 // 在不破坏封装性的前提下&#xff0c;捕获对象的内部…...

OWASP安全练习靶场juice shop-更新中

Juice Shop是用Node.js&#xff0c;Express和Angular编写的。这是第一个 完全用 JavaScript 编写的应用程序&#xff0c;列在 OWASP VWA 目录中。 该应用程序包含大量不同的黑客挑战 用户应该利用底层的困难 漏洞。黑客攻击进度在记分板上跟踪。 找到这个记分牌实际上是&#…...

当使用RSA加密,从手机前端到服务器后端的请求数据存在+

将转成了空格&#xff0c;导致解密出错 将空格转成了...

BUUCTF crypto做题记录(3)新手向

目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文&#xff1a;U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码&#xff0c;上网搜索&#xff0c;在侧栏发现Rabbit解码&#xff0c;直接搜索就能有在线解码网站 二、篱笆…...

SpringMVC修炼之旅(2)基础入门

一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…...

matlab 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理...

ASPICE-汽车软件开发能力评级

Automotive SPICE&#xff08;简称A-SPICE 或 ASPICE&#xff09;&#xff0c;全称是“Automotive Software Process Improvement and Capacity dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架。 常被用于评估一家汽车软件供应商的软件开发能力&#x…...

准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制

在 CentOS 8 上配置 PostgreSQL 14 的主从复制&#xff0c;并设置 WAL 归档到特定路径 /home/postgres/archive 的步骤如下&#xff1a; 主服务器配置&#xff08;主机&#xff09; 配置 PostgreSQL&#xff1a; 编辑 postgresql.conf 文件&#xff1a; vim /data/postgres/p…...

leetcode 1466

leetcode 1466 使用dfs 遍历图结构 如图 node 4 -> node 0 -> node 1 因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线&#xff0c;都需要修改&#xff0c;反之&#xff0c;如果是通向0的节点&#xff0c;例如节点4&#xff0c;则把节点4当作父节点的节点&…...

想学编程,但不知道从哪里学起,应该怎么办?

怎样学习任何一种编程语言 我将教你怎样学习任何一种你将来可能要学习的编程语言。本书的章节是基于我和很多程序员学习编程的经历组织的&#xff0c;下面是我通常遵循的流程。 1&#xff0e;找到关于这种编程语言的书或介绍性读物。 2&#xff0e;通读这本书&#xff0c;把…...

Python数据科学视频讲解:Python概述

2.1 Python概述 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.1节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应用和…...

数据结构之内部排序

目录 7-1 直接插入排序 输入格式: 输出格式: 输入样例: 输出样例: 7-2 寻找大富翁 输入格式: 输出格式: 输入样例: 输出样例: 7-3 PAT排名汇总 输入格式: 输出格式: 输入样例: 输出样例: 7-4 点赞狂魔 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&a…...

软考高级备考-系统架构师(机考后新版教材的备考过程与资料分享)

软考高级-系统架构设计师 考试复盘1.考试结果2.备考计划3.个人心得 资料分享 考试复盘 1.考试结果 三科压线过&#xff0c;真是太太太太太太太幸运了。上天对我如此眷顾&#xff0c;那不得不分享下我的备考过程以及一些备考资料&#xff0c;帮助更多小伙伴通过考试。 2.备考…...

Spring Boot 整合kafka:生产者ack机制和消费者AckMode消费模式、手动提交ACK

目录 生产者ack机制消费者ack模式手动提交ACK 生产者ack机制 Kafka 生产者的 ACK 机制指的是生产者在发送消息后&#xff0c;对消息副本的确认机制。ACK 机制可以帮助生产者确保消息被成功写入 Kafka 集群中的多个副本&#xff0c;并在需要时获取确认信息。 Kafka 提供了三种…...

Java+Swing: 主界面组件布局 整理9

说明&#xff1a;这篇博客是在上一篇的基础上的&#xff0c;因为上一篇已经将界面的框架搭好了&#xff0c;这篇主要是将里面的组件完善。 分为三个部分&#xff0c;北边的组件、中间的组件、南边的组件 // 放置北边的组件layoutNorth(contentPane);// 放置中间的 Jtablelayou…...

pytorch:YOLOV1的pytorch实现

pytorch&#xff1a;YOLOV1的pytorch实现 注&#xff1a;本篇仅为学习记录、学习笔记&#xff0c;请谨慎参考&#xff0c;如果有错误请评论指出。 参考&#xff1a; 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(Y…...

YOLOv8配置文件yolov8.yaml解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 位置 该文件的位置位于 ./ultralytics/cfg/models/v8/yolov8.yaml 模型参数配置 # Parameters nc: 80 # number of classes scales: #…...

4-Tornado高并发原理

核心原理就是协程epoll事件循环&#xff0c;再使用协程之后&#xff0c;开销是特别的小&#xff0c;那具体如何提供高并发的呢&#xff1f; 异步非阻塞IO 这意味我们整套开发的模式不在与原来一样&#xff0c;正因为不再一样&#xff0c;所以有时我们在理解代码时就有可能会比…...

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…...

【BME2112】w11 notes

下周做老鼠实验 group analysis SPM group analysis 数据地址resting state 可以分析&#xff1a;correlation 计算两个脑区的相关性 静息态实验简单functional 成功的实验能看到激活区不成功的实验&#xff1a;比如被试头动太大&#xff0c;不是健康的被试 Spontaneous brain…...

微软老员工称部分“被更新损坏“的电脑实际早已注定失败

据微软资深工程师雷蒙德陈表示&#xff0c;微软的系统更新并非总是客户设备损坏的罪魁祸首。有时这些设备早已存在问题&#xff0c;只是客户在补丁星期二重启尝试导致系统无法启动之前没有注意到。更新背后的真相陈在文章中写道&#xff1a;"我在企业产品支持部门的同事们…...

DietPi开发者工具链终极指南:Git、VSCodium、PHP Composer一站式配置

DietPi开发者工具链终极指南&#xff1a;Git、VSCodium、PHP Composer一站式配置 【免费下载链接】DietPi Lightweight justice for your single-board computer! 项目地址: https://gitcode.com/gh_mirrors/di/DietPi DietPi作为轻量级的单板计算机系统&#xff0c;为开…...

AA-PEG-C12/C16/C18,乙酸聚乙二醇月桂/棕榈/硬脂酸酯,一类结合了乙酸、聚乙二醇和长链烷基的化合物

一.名称英文名称&#xff1a;AA-PEG-C12/C16/C18&#xff0c;Acetic Acid-PEG-C12/C16/C18中文名称&#xff1a;乙酸聚乙二醇月桂/棕榈/硬脂酸酯&#xff0c;乙酸-PEG-月桂/棕榈/硬脂酸酯分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&…...

Pixel Dream Workshop应用场景:像素游戏测试用占位图(placeholder)批量生成

Pixel Dream Workshop应用场景&#xff1a;像素游戏测试用占位图批量生成 1. 像素游戏开发中的占位图挑战 在独立游戏开发过程中&#xff0c;美术资源往往是开发进度的瓶颈之一。特别是对于像素风格的游戏项目&#xff0c;开发者经常面临一个两难选择&#xff1a; 等待专业美…...

【Python 3.14 JIT性能调优权威指南】:20年CPython核心开发者亲授3大接入瓶颈突破法

第一章&#xff1a;Python 3.14 JIT编译器的演进脉络与接入价值Python 3.14 引入了实验性但高度集成的内置 JIT&#xff08;Just-In-Time&#xff09;编译器&#xff0c;标志着 CPython 运行时首次在官方发行版中提供可生产级启用的动态编译能力。该 JIT 并非独立运行时或第三方…...

NSGA-III中的参考点生成与多样性维护机制解析

1. NSGA-III算法中的参考点是什么&#xff1f; 第一次接触NSGA-III算法时&#xff0c;最让我困惑的就是这个"参考点"概念。简单来说&#xff0c;参考点就像是多目标优化问题中的导航灯塔&#xff0c;它们均匀分布在目标空间里&#xff0c;指引算法找到分布均匀的解集…...

车轨桥刚柔耦合仿真与 Simpack 与 Abaqus 联合仿真那些事儿

1.simpack与abaqus联合仿真教程 2.车轨桥刚柔耦合仿真教程&#xff0c;柔性钢轨建模&#xff0c;fbi文件生成&#xff0c;ftr文件书写 3.包括模型在工程仿真领域&#xff0c;车轨桥刚柔耦合仿真以及 Simpack 与 Abaqus 联合仿真都是极具实用价值的技术&#xff0c;今天就来给大…...

PyInstaller Extractor完全指南:从可执行文件到Python源代码的高效提取方案

PyInstaller Extractor完全指南&#xff1a;从可执行文件到Python源代码的高效提取方案 【免费下载链接】pyinstxtractor PyInstaller Extractor 项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor 问题引入&#xff1a;当你遇到无法打开的Python可执行文件时…...

杰理AD14N/AD15N---自定义GPIO唤醒与长按键开关机配置实战

1. 认识杰理AD14N/AD15N的GPIO唤醒机制 第一次接触杰理AD14N/AD15N芯片的开发者&#xff0c;往往会被其GPIO唤醒机制搞得一头雾水。我刚开始调试时也踩过不少坑&#xff0c;比如明明按照手册配置了唤醒引脚&#xff0c;设备却怎么都唤不醒。后来才发现&#xff0c;问题出在对底…...

关键词点击排名工具可以提高网站流量吗_关键词点击排名工具分析结果如何应用到SEO优化

关键词点击排名工具可以提高网站流量吗 在现代数字营销中&#xff0c;关键词点击排名工具已经成为许多网站和SEO专家的必备工具。它们提供了有关关键词的搜索量、竞争程度等重要数据&#xff0c;有助于网站优化和流量提升。但究竟这些工具能否真正提高网站流量&#xff0c;我们…...