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

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

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

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值