博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式-备忘录模式

Posted on 2015-12-02 09:34  大漠小鸟  阅读(277)  评论(0)    收藏  举报

设计需要回放的软件,记录一下事物的状态。数据库备份,文档的编译,撤销,恢复

设计备忘录三大步骤
1.设计记录的节点,存储记录,//记录鼠标,键盘的状态
2.设计记录的存储,vector,list,map,set,链表,图,数组,树
3.操作记录的类,记录节点状态,设置节点状态,显示状态

 下面以保存游戏进度为例

//需要保存的信息
class Memo
{
public:
    int mAttack;
    int mDefence;
    int mHeal;
    Memo(int attack, int defense, int heal) :mAttack(attack), mDefence(defense), mHeal(heal){}
    void operator=(const Memo& memo)
    {
        mAttack = memo.mAttack;
        mDefence = memo.mDefence;
        mHeal = memo.mHeal;
    }
};
//游戏角色
class GameRole
{
private:
    int mAttack;
    int mDefence;
    int mHeal;
public:
    GameRole() :mAttack(100), mDefence(100), mHeal(100){}
    Memo save()//保存进度
    {
        Memo memo(mAttack, mDefence, mHeal);
        return memo;
    }
    void load(const Memo& memo)//读取进度
    {
        mAttack = memo.mAttack;
        mDefence = memo.mDefence;
        mHeal = memo.mHeal;
    }
    void show()
    {
        cout << "attack:" << mAttack << endl;
        cout << "defence:" << mDefence << endl;
        cout << "health;" << mHeal << endl;
    }
    void attack()
    {
        mAttack = 200;
        mDefence = 0;
        mHeal = 100;
    }
};

//管理进度库
class Caretaker
{
private:
    vector<Memo> mVecMemo;
public:
    void save(const Memo& memo)
    {
        mVecMemo.push_back(memo);
    }
    Memo& load(int i)
    {
        return mVecMemo[i];
    }
};

 

客户使用方法:

int _tmain(int argc, _TCHAR* argv[])
{
    Caretaker caretaker;
    GameRole player1;
    player1.show();//显示初始值
    player1.attack();
    caretaker.save(player1.save());//攻击后保存进度
    player1.load(caretaker.load(0));//读取存档0
    player1.show();//显示结果
    system("pause");
    return 0;
}