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

C++备忘录模式

在读《大话设计模式》,在此记录有关C++实现备忘录模式。

场景引入:游戏中的存档,比如打boss之前记录人物的血量等状态。

下面代码是自己根据理解实现的存档人物血量功能。

#include <iostream>using namespace std;//声明玩家类
class GamePlayer {
public:GamePlayer(int volume = 100) :bloodVolume(volume) {};void setBloodVolume(int volume) {bloodVolume = volume;};void decreaseBloodVolume(int volume) {if (bloodVolume < volume){bloodVolume = 0;}else {bloodVolume = bloodVolume - volume;}}int getBloodVolume() {return bloodVolume;};void showBloodVolume() {std::cout << "当前角色血量为" << bloodVolume << std::endl;}private:int bloodVolume;	//血量
};//声明备忘录类
class memorandum {
public:void setMemor(GamePlayer& setPlayer){std::cout << "正在存档..." << std::endl;this->player.setBloodVolume(setPlayer.getBloodVolume());}void getMemor(GamePlayer& getPlayer){std::cout << "正在读档..." << std::endl;getPlayer.setBloodVolume(player.getBloodVolume());}private:GamePlayer player;
};int main()
{GamePlayer player(60);	player.showBloodVolume();memorandum playerMemory;//存档playerMemory.setMemor(player);//模拟玩家受到攻击player.decreaseBloodVolume(20);player.showBloodVolume();//回档playerMemory.getMemor(player);player.showBloodVolume();return 0;
}

上面这段代码,声明了一个备忘录类,传入要存档的对象,获取其数据,临时存储在private的成员变量中。读档的时候引用传入玩家类,根据需要拷贝原先存储的数据。但是如果这时候需要添加蓝量相关的数据存储,需要修改的代码很多,首先是备忘录类中函数获取的数据要修改。然后玩家类中要新添加操作蓝量对应的接口。将备忘录类放在玩家类中,可以避免这些接口的声明

代码如下:

#include <iostream>
#include <memory>using namespace std;//声明玩家类
class GamePlayer {
public:GamePlayer(int volume = 100) :bloodVolume(volume) {};//声明备忘录类class memorandum {public:int bloodVolume;memorandum(int bloodNum) :bloodVolume(bloodNum) {};};void setBloodVolume(int volume) {bloodVolume = volume;};void decreaseBloodVolume(int volume) {if (bloodVolume < volume){bloodVolume = 0;}else {bloodVolume = bloodVolume - volume;}}int getBloodVolume() {return bloodVolume;};void showPlayerState() {std::cout << "当前角色血量为" << bloodVolume << std::endl;}//存档void savePlayerState() {std::cout << "存档中..." << std::endl;memor = std::make_shared<memorandum>(bloodVolume);}void readPlayerState() {std::cout << "读档中..." << std::endl;bloodVolume = memor->bloodVolume;		//读取人物血量}private:int bloodVolume;	//血量std::shared_ptr<memorandum> memor;
};int main()
{GamePlayer player(60);	player.showPlayerState();player.savePlayerState();//模拟玩家受到攻击player.decreaseBloodVolume(20);player.showPlayerState();//读档档player.readPlayerState();player.showPlayerState();//再次受到攻击player.decreaseBloodVolume(10);player.savePlayerState();player.readPlayerState();	//读档player.showPlayerState();	//展示当前数据return 0;
}

这时,如果存档和读档更多的数据比如蓝量,怒气值,经验等,客户端代码不需要修改,仅需要修改玩家类中的代码。

http://www.lryc.cn/news/496425.html

相关文章:

  • 【Electron学习笔记(四)】进程通信(IPC)
  • Java 中的 remove 方法深度解析
  • 企业品牌曝光的新策略:短视频矩阵系统
  • 【初阶数据结构与算法】二叉树顺序结构---堆的应用之堆排、Top-K问题
  • vue3 + ts 使用 el-tree
  • Create Stunning Word Clouds with Ease!
  • html+css网页设计 旅游 马林旅行社5个页面
  • python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容
  • React基础教程(11):useCallback记忆函数的使用
  • arp-scan 移植到嵌入式 Linux 系统是一个涉及多个步骤的过程
  • 【Linux】常用命令一
  • 在鲲鹏麒麟服务器上部署MySQL主从集群
  • Siknhorn算法介绍
  • 群控系统服务端开发模式-应用开发-邮箱短信通道功能开发
  • [docker中首次配置git环境]
  • 书生浦语·第四期作业合集
  • 5G学习笔记之PRACH
  • Ubuntu24.04配置DINO-Tracker
  • 抓包之查看websocket内容
  • 【Leetcode Top 100】21. 合并两个有序链表
  • 账本模型
  • openwrt利用nftables在校园网环境下开启nat6 (ipv6 nat)
  • 24.12.02 Element
  • 记录QT5迁移到QT6.8上的一些问题
  • 清理Linux/CentOS7根目录的思路
  • 【LInux】kvm添加u盘启动引导
  • .net XSSFWorkbook 读取/写入 指定单元格的内容
  • GaussDB(类似PostgreSQL)常用命令和注意事项
  • 【HM-React】02. React基础-下
  • 【力扣热题100】—— Day3.反转链表