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