备忘录模式 详解

备忘录模式

简介: 保存一个对象的某个状态,以便在适当的时候恢复对象, 允许在不破坏封装性的前提下,捕获和恢复对象的内部状态。
场景: 很多地方都用到了备忘录模式, 比如网络消息的序列化和反序列化, 数据的本地保存与加载等, 最简单的json的dump和load就是一个极简的备忘录模式.
结构

复制代码
主要分为三个部分
1: 目标类, 负责实现自己的序列化和反序列化方法
2: 操作类, 负责将目标类序列化的结果保存到第三方里(网络或者本地文件) 和 将结果反序列化成目标类
3: 至于管理者, 这个可有可无吧

例子

我们设计一个游戏, 其中有一个核心的类GameObject, 我们加载游戏和退出游戏是, GameObject要能够把自己的数据导出和导入,

然后在设计一个类GameSaver, 来对导出的数据进行保存, 和 将保存的数据导入游戏, 复原GameObject实例
代码

cpp 复制代码
class GameObject
{
private:
	int hp, mp;
public:
	GameObject() {};
	GameObject(int h, int m) : hp(h), mp(m) {};
	void display()
	{
		cout << "hp : " << hp << " ; mp : " << mp << endl;
	}
	string get_state()
	{
		stringstream ss;
		ss << hp << ";" << mp;
		return ss.str();
	}
	void set_state(string s)
	{
		int t = s.find_first_of(';');
		hp = stoi(s.substr(0, t - 0));
		mp = stoi(s.substr(t + 1, s.size() - t - 1));
	}
};


class GameSaver
{
private:
	string database_str;
public:
	GameObject* load_game()
	{
		GameObject* g = new GameObject();
		g->set_state(database_str);
		return g;
	}
	void save_game(GameObject* g)
	{
		database_str = g->get_state();
	}
};


int main()
{
	GameObject* g = new GameObject(100, 100);
	GameSaver* gs = new GameSaver();

	cout << "start game" << endl;
	g->display();
	gs->save_game(g);

	delete g;
	GameObject* g2 = gs->load_game();
	cout << "load game" << endl;
	g2->display();

	return 0;
}

执行结果

相关推荐
程序喵大人4 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
by209995 小时前
vector 的模拟实现:扩容与边界的详细阐述(下)
c++·经验分享·vector·动态数组
余额瞒着我当琳8 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂8 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan9 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘9 小时前
C++继承
c++·继承
汉克老师10 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程
jimy112 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
潼心1412o13 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i13 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2