设计模式 --> (13)备忘录模式
2024-09-04 06:30:05
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
示例
玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。
Memento类定义了内部的状态,而Caretake类是一个保存进度的管理者,GameRole类是游戏角色类。可以看到GameRole的对象依赖于Memento对象,而与Caretake对象无关。
#include <iostream>
#include <vector>
using namespace std; //需保存的信息
class Memento
{
public:
int m_vitality; //生命值
int m_attack; //进攻值
int m_defense; //防守值
public:
Memento(int vitality, int attack, int defense):
m_vitality(vitality),m_attack(attack),m_defense(defense){}
Memento& operator=(const Memento &memento)
{
m_vitality = memento.m_vitality;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
return *this;
}
}; //游戏角色
class GameRole
{
private:
int m_vitality;
int m_attack;
int m_defense;
public:
GameRole(): m_vitality(),m_attack(),m_defense() {}
Memento Save() //保存进度,只与Memento对象交互,并不牵涉到Caretake
{
Memento memento(m_vitality, m_attack, m_defense);
return memento;
}
void Load(Memento memento) //载入进度,只与Memento对象交互,并不牵涉到Caretake
{
m_vitality = memento.m_vitality;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
}
void Show() { cout<<"vitality : "<< m_vitality<<", attack : "<< m_attack<<", defense : "<< m_defense<<endl; }
void Attack() { m_vitality -= ; m_attack -= ; m_defense -= ; }
};
//保存的进度库
class Caretake
{
public:
Caretake() {}
void Save(Memento menento) { m_vecMemento.push_back(menento); }
Memento Load(int state) { return m_vecMemento[state]; }
private:
vector<Memento> m_vecMemento;
}; //测试案例
int main()
{
Caretake caretake;
GameRole role;
role.Show(); //初始值
caretake.Save(role.Save()); //保存状态
role.Attack();
role.Show(); //进攻后
role.Load(caretake.Load()); //载入状态
role.Show(); //恢复到状态0
return ;
}
参考:http://blog.csdn.net/wuzhekai1985
最新文章
- Node聊天程序实例02:chat_server.js
- C#:IO
- Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)
- 【转】android onNewIntent()触发机制及注意事项
- 理解WebKit和Chromium: 调试Android系统上的Chromium
- (从终端看linux-1)linux tty pty pts 概念 区别
- apk 反编译记录
- (转载)javascript转自世纪流年blog
- java 加减乘除错误
- 使用SeekBar办Android调色板
- angular element()
- 关于swagger——WebApi一个controller中出现多个Get是出现错误的处理
- 使用@Valid和BindingResult验证请求参数的合法性并处理校验结果
- Mycat实现mysql主从复制(读写分离)
- mui之上拉刷新和mui-content结合解决ios上拉不回弹的bug
- 使用fabric2打包部署文件
- 16,EasyNetQ-群集支持
- Hibernate.编写xml文件无自动提示信息
- Cname与A记录(Address)区别
- [TJOI2014]Alice and Bob[拓扑排序+贪心]