什么是备忘录模式
在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
角色
角色 | 角色作用 |
---|---|
Originator | 负责创建一个Mementor,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态 |
Mementor | 负责存Originator对象的内部状态,并可防止Originator以外的对象方位备忘录 |
Caretaker | 负责保存好备忘录 |
实例来自《大话设计模式》,保存游戏进度
#include<iostream>
#include<vector>
using namespace std;
struct Mementor
{
private:
int m_vitality;
int m_attack;
int m_defense;
public:
int getvitality(){return m_vitality;}
int getattack(){return m_attack;}
int getdefense(){return m_defense;}
Mementor(int vitality, int attack, int defense):m_vitality(vitality),m_attack(attack),m_defense(defense){}
Mementor operator=(const Mementor& mementor)
{
this->m_attack = mementor.m_attack;
this->m_defense = mementor.m_defense;
this->m_vitality = mementor.m_vitality;
return *this;
}
};
struct Originator
{
private:
int m_vitality;
int m_attack;
int m_defense;
public:
Originator():m_vitality(100),m_attack(100),m_defense(100){}
Mementor creatMementor() \\创建一个Mementor 对象
{
Mementor mementor(m_vitality, m_attack, m_defense);
return mementor;
}
void Load(Mementor mementor)
{
this->m_attack = mementor.getattack();
this->m_defense = mementor.getdefense();
this->m_vitality = mementor.getvitality();
}
void showState()
{
cout << m_attack << m_vitality << m_defense << endl;
}
void attacked()
{
this->m_attack -=10;
this->m_defense -=10;
this->m_vitality -=10;
}
};
struct Caretake \\管理备忘录
{
public:
Caretake(){}
void Save(Mementor menento) { m_vecMemento.push_back(menento); }
Mementor Load(int state) { return m_vecMemento[state]; }
private:
vector<Mementor> m_vecMemento;
};
int main()
{
Originator orig1;
orig1.showState();
orig1.attacked();
orig1.showState();
Mementor mem = orig1.creatMementor();
Caretake caretake;
caretake.Save(mem);
Originator orig2; \\新建游戏时,可以load备忘录
orig2.showState();
orig2.Load(caretake.Load(0));
orig2.showState();
return 0;
}
心得:
1.备忘录不一定要存Originator对象的所有状态,可以依据具体条件创建;
2.Caretake 的维护很关键,其实Mementor 只是一个过渡,最主要还是Caretake 和Originator的联系。