您的位置:首页 > 其它

设计模式学习(十七)————备忘录模式

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

就拿游戏的角色数据来举个例子:

#ifndef GAMEROLE
#define GAMEROLE
#include <QtDebug>

//角色状态存储箱
class RoleStateMemento
{
public:
RoleStateMemento(int vit,int atk,int def):_vit(vit),_atk(atk),_def(def){}
int getVitality(){return _vit;}
void setVitality(int vit){_vit=vit;}
int getAttack(){return _atk;}
void setAttack(int atk){_atk=atk;}
int getDefense(){return _def;}
void setDefense(int def){_def=def;}
private:
int _vit;
int _atk;
int _def;
};
//游戏角色
class GameRole
{
public:
int getVitality(){return _vit;}
void setVitality(int vit){_vit=vit;}
int getAttack(){return _atk;}
void setAttack(int atk){_atk=atk;}
int getDefense(){return _def;}
void setDefense(int def){_def=def;}
QSharedPointer<RoleStateMemento> SaveState(){return QSharedPointer<RoleStateMemento>(new RoleStateMemento(_vit,_atk,_def));}
void RecoveryState(RoleStateMemento me){_vit=me.getVitality();_atk=me.getAttack();_def=me.getDefense();}
void stateDisplay()
{
qDebug()<<"角色当前状态:";
qDebug()<<"体力:"<<_vit;
qDebug()<<"攻击力:"<<_atk;
qDebug()<<"防御力:"<<_def;
}
private:
int _vit;
int _atk;
int _def;
};
//角色状态管理者
class RoleStateCaretaker
{
public:
RoleStateCaretaker(int vit=0,int atk=0,int def=0):_meto(RoleStateMemento(vit,atk,def)){}
void setRoleStateMemento(RoleStateMemento meto){_meto=meto;}
RoleStateMemento getRoleStateMemento(){return _meto;}
private:
RoleStateMemento _meto;
};

#endif // GAMEROLE


这样就可以随时进行游戏数据的存储和取得啦,主程序可以模拟这一个过程:

#include "gamerole.h"
#include <QtDebug>

int main(int argc, char *argv[])
{
//大战前
GameRole *gr = new GameRole();
gr->setAttack(100);gr->setDefense(100);gr->setVitality(100);
qDebug()<<"初始";
gr->stateDisplay();

//保存进度
RoleStateCaretaker *roleAdm = new RoleStateCaretaker();
roleAdm->setRoleStateMemento(*gr->SaveState());

//大战boss,损失严重
gr->setAttack(50);gr->setDefense(50);gr->setVitality(50);
qDebug()<<"大战后";
gr->stateDisplay();

//恢复之前状态
gr->RecoveryState(roleAdm->getRoleStateMemento());
qDebug()<<"读取存档后";
gr->stateDisplay();
return 0;
}


由这个例子可以看到,
RoleStateCaretaker
类管理着一个
RoleStateCaretaker
类的实例,可以随时保存和恢复这个实例里面的数据。这样就做到了备忘录模式的核心内容————保存和恢复!

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/gameSave_Memento_Pattern_18
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式