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

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.kler.cn/a/421142.html

相关文章:

  • 产品经理的投资理财课:开放式基金和封闭式基金
  • 实例分割模型的数据集格式转换
  • Spark常问面试题---项目总结
  • 【25春招前端八股文】——JS数据类型检测方式
  • 动态规划-----路径问题
  • HTML 快速上手
  • 汽车智能扭矩控制系统的未来发展趋势分析
  • 2024年认证杯SPSSPRO杯数学建模A题(第一阶段)保暖纤维的保暖能力全过程文档及程序
  • 显卡(Graphics Processing Unit,GPU)光线追踪详细介绍
  • HTML5+JavaScript实现连连看游戏
  • 2025年软考开考科目有哪些?中高级科目哪个容易拿证?
  • 基于“微店 Park”模式下 2+1 链动模式商城小程序的创新发展与应用研究
  • 24年某马最新大数据相关软件安装文档
  • 每日小知识
  • autogen-agentchat 0.4.0.dev8版本的安装
  • HarmonyOS开发:关于签名信息配置详解
  • 【系统架构设计师】真题论文: 论软件质量保证及其应用(包括解题思路和素材)
  • Chromium网络调试篇-Fiddler 5.21.0 使用指南:捕获浏览器HTTP(S)流量(二)
  • CPU渲染和GPU渲染各自特点,优势,场景使用
  • 微信小程序横滑定位元素案例代码
  • 【GPT】代谢概念解读
  • uni-app打包为安卓APP的权限配置问题探索
  • 高效数据分析:五款报表工具助力企业智能决策
  • Spring Boot 启动流程详解
  • CSS定位技术详解:从基础到高级应用
  • koa中间件