您的位置:首页 > 其它

设计模式学习--备忘录模式

2017-03-13 22:45 363 查看
  备忘录模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。



  把要保存的细节给封装在了Memento中了,哪一天要更改保存的细节也不用影响客户端了。

  应用:Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

#include <iostream>

using namespace std;

class State //状态存储箱
{
int vit; //体力
int atk; //攻击力
int def; //防御力
public:
State(int v, int a, int d):vit(v), atk(a), def(d){}; //构造函数
int getvit(){return vit;} //获取体力
int getatk(){return atk;} //获取攻击力
int getdef(){return def;} //获取防御力
};

class StateManger //状态管理
{
State* m_state; //用于存放状态
public:
void setstate(State* sta) //构造函数 传入状态
{
m_state = sta;
}

State* getstate() //获取状态
{
return m_state;
}
};

class GameRole //游戏角色
{
int vit; //体力
int atk; //攻击力
int def; //防御力
public:
void stateDisplay() //显示当前状态
{
cout<<"当前角色状态:"<<endl;
cout<<"体力:"<<vit<<endl;
cout<<"攻击力:"<<atk<<endl;
cout<<"防御力:"<<def<<endl;
}

void Initstate() //初始化状态
{
vit = 100;
atk = 100;
def = 100;
}

State* savestate() //存档
{
return (new State(vit, atk, def));
}

void recoverystate(State* memento) //读档
{
vit = memento->getvit();
atk = memento->getatk();
def = memento->getdef();
}

void fight() //攻打boss
{
vit = 0;
atk = 0;
def = 0;
}
};

int main()
{
GameRole* xiaoyan = new GameRole(); //创建游戏角色对象
xiaoyan->Initstate(); //初始化状态
xiaoyan->stateDisplay(); //显示当前状态

StateManger* Manger = new StateManger(); //创建档案管理对象
Manger->setstate(xiaoyan->savestate()); //存档

cout<<endl;
xiaoyan->fight(); //攻打boss
xiaoyan->stateDisplay(); //显示当前状态

cout
4000
<<endl;
xiaoyan->recoverystate(Manger->getstate()); //读档
xiaoyan->stateDisplay(); //显示当前状态

return 0;
}

显示结果:
[hjf@hjf 设计模式]$ ./a.out 

当前角色状态:

体力:100

攻击力:100

防御力:100

当前角色状态:

体力:0

攻击力:0

防御力:0

当前角色状态:

体力:100

攻击力:100

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