备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
备忘录模式结构图:
Originator类,负责闯将一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录回复内部状态。
MeMento类,负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。
Caretaker类,负责保存好备忘录Memento。
案例:游戏进度备忘录
详细代码:
/*
*备忘录模式
*/
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class RoleStateMemento;
//RoleStateOriginator
class GameRoleOriginator
{
private:
int vit = 100;//生命力,默认角色状态都为100
int atk = 100;//攻击力
int def = 100;//防御力
public:
void GetState()//获得游戏角色的状态
{
cout << "游戏角色的当前状态:" << endl;
cout << "生命力:" << vit << endl;
cout << "攻击力:" << atk << endl;
cout << "防御力:" << def << endl;
}
void Fight()//每战斗一次,各个值减少20
{
if (vit >= 20)
{
vit -= 20;
atk -= 20;
def -= 20;
}
else
cout << "状态消耗殆尽,GameOver!" << endl;
}
RoleStateMemento* SaveState();//保存当前状态
void RecoveryState(RoleStateMemento *memo);//恢复当前状态
};
//RoleStateMemento类
class RoleStateMemento
{
public:
int vit;//生命力
int atk;//攻击力
int def;//防御力
RoleStateMemento(int vit, int atk, int def) :
vit(vit), atk(atk), def(def)
{}
};
//RoleStateCaretaker类
class RoleStateCaretaker
{
public:
vector < RoleStateMemento* > memento;
void Save(RoleStateMemento* mem)//保存角色状态
{
memento.push_back(mem);
}
RoleStateMemento* GetRoleState(int i)//获得角色状态
{
return memento[i];
}
};
RoleStateMemento* GameRoleOriginator::SaveState()//保存当前状态
{
return(new RoleStateMemento(vit, atk, def));
}
void GameRoleOriginator::RecoveryState(RoleStateMemento *memo)//恢复当前状态
{
vit = memo->vit;
atk = memo->atk;
def = memo->def;
}
int main()
{
//大战boss前
GameRoleOriginator *lixiaoyao = new GameRoleOriginator();
lixiaoyao->GetState();
lixiaoyao->Fight();
lixiaoyao->GetState();
RoleStateCaretaker rs;
rs.Save(lixiaoyao->SaveState());//保存当前状态 各为80
lixiaoyao->Fight();
rs.Save(lixiaoyao->SaveState());//保存当前状态 各为60
lixiaoyao->Fight();
lixiaoyao->Fight();
lixiaoyao->Fight();//经过5轮厮杀,三项指标全为0
lixiaoyao->GetState();
//恢复第一次保存的状态
RoleStateMemento *roleState=rs.GetRoleState(0);
lixiaoyao->RecoveryState(roleState);
lixiaoyao->GetState();
return 0;
}
运行结构如下: