备忘录模式:备忘录对象时一个用来存储另外一个对象内部状态的快照对象。
备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住并外部化,存储起来从而可以在将来合适的时候把这个对象还原到存储起来的状态。
设计备忘录三大步骤:
1、设计记录的节点(数据),存储记录
2、设计记录的存储vector、list、set、链表、图、数组等
3、操作记录的类,记录节点的状态设置节点状态,显示状态
例子如下:
//备忘录的节点 --(需要保存的信息)
class Memento
{
public:
Memento(int hp, int attack, int defense) :hp(m_hp), m_attack(attack), m_defense(defense){}
public:
int m_hp;//生命值
int m_attack; //进攻值
int m_defense;//防守值
};
//备忘录的集合--(保存的进度)
class Catetake
{
public:
Catetake(){}
void Save(Memento memento)
{
m_vecmemento.push_back(memento);
}
Memento Load(int state)
{
return m_vecmemento[state];
}
private:
vector<Memento>m_vecmemento;
};
//类的包含备忘录的节点--(游戏角色)
class GameRole
{
public:
GameRole() :m_hp(100), m_attack(100), m_defense(100){}
Memento Save()//保存进度,只与Memento对象交互,并不牵涉到Caretake
{
Memento memento(m_hp,m_attack,m_defense);
return memento;
}
void Load(Memento memento)//载入进度,只与Meneto对象交互,并不牵涉到Caretake
{
m_hp= memento.m_hp;
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_hp-= 10; m_attack -= 10; m_defense -= 10;
}
private:
int m_hp;
int m_attack;
int m_defense;
};
//test
void main()
{
Catetake caretake;
GameRole role;
role.show();//初始值
caretake.Save(role.Save());//保存状态
role.Attack();
role.show();//进攻后
role.Load(caretake.Load(0));//载入状态
role.show();//恢复到状态0
cin.get();
}
结果如下: