欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 备忘录模式 详解

备忘录模式 详解

2024/11/30 12:51:09 来源:https://blog.csdn.net/qq_40666620/article/details/141680893  浏览:    关键词:备忘录模式 详解

备忘录模式

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

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

例子
我们设计一个游戏, 其中有一个核心的类GameObject, 我们加载游戏和退出游戏是, GameObject要能够把自己的数据导出和导入,
然后在设计一个类GameSaver, 来对导出的数据进行保存, 和 将保存的数据导入游戏, 复原GameObject实例
代码

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;
}

执行结果
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com