您的位置:首页 > 编程语言 > C语言/C++

C++ 18备忘录模式

2015-12-14 10:30 489 查看
备忘录模式(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;
}
运行结构如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: