时间:2016年9月23日 天气:晴:sunny:
Author:冬之晓:angry:
Email: 347916416@qq.com
MyAppearance:
今天晚上加班,领导看到了,给我们拿了好多零食,非常高兴!
今天感觉收获挺大的:
其一是吧一个Qt的关于文本编辑的第三方库给弄懂了用法,这个使用方法我要等明天或后天写一个专题总结一下!!
其二是发现了一个UDP连不上处理的简单方法,以前每次UDP连接不上我都是直接重置电脑!这样每次电脑里面的软件都需要全部重新安装,费时费力! 这一次我发现直接使用驱动精灵或者360里面的“连接不上网”的选项,重置一下网络的设置就好了!!!!以前我真的是太笨啦!!!
设计模式(十七)————备忘录模式
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
就拿游戏的角色数据来举个例子:
#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