设计模式-行为模式-备忘录模式

2020-04-30  本文已影响0人  阿棍儿_Leon

备忘录模式要求不破坏封装的前提下将对象内的状态保存到对象外,并且可以用这个状态恢复对象。典型应用是游戏的存档机制。

以下代码定义了游戏的存档,假设我们关心的对象状态可以用一个整型数表示。

#include <iostream>

using namespace std;

class Slot
{
private:
    int m_state;
public:
    Slot(int state):m_state(state){}
    int GetState()
    {
        return m_state;
    }
};

以下代码定义了游戏类,也就是这个模式所关心的对象,它可以用当前状态创建存档,也能应用存档覆盖当前游戏状态。

class Game
{
private:
    int state;
public:
    Game():state(0){}
    void LoadGameSlot(Slot* slot)
    {
        state = slot->GetState();
        cout<<__FUNCTION__<<":\tstate="<<state<<endl;
    }
    Slot* CreateSlot()
    {
        return new Slot(state);
    }
    void Play()
    {
        cout<<__FUNCTION__<<":\tstate="<<state<<endl;
    }
};

以下代码定义了一个存档管理器,它负责管理存档。为了简单,这里只支持一份存档。

class GameSlotManager
{
private:
    Slot* m_pSlot;
public:
    GameSlotManager():m_pSlot(nullptr){}
    void Save(Slot* m)
    {
        if (m_pSlot)
        {
            delete m_pSlot;
            m_pSlot = nullptr;
        }
        m_pSlot = m;
        cout<<__FUNCTION__<<":\tstate="<<m->GetState()<<endl;
    }
    Slot* Load()
    {
        cout<<__FUNCTION__<<":\tstate="<<m_pSlot->GetState()<<endl;
        return m_pSlot;
    }
};

以下代码模拟了一个玩游戏的过程。
首先创建存档管理器和游戏,然后创建了两个存档(512和1024)。
先未加载存档进行游戏,然后加载1024存档游戏,并进行游戏,然后保存游戏创建的存档。
接下来加载512存档进行游戏。
最后加载存档管理器中的存档进行游戏。

int main(void){

    GameSlotManager gameSlotManager;
    Game game;
    Slot slot512(512);
    Slot slot1024(1024);
    game.Play();
    game.LoadGameSlot(&slot1024);
    game.Play();
    gameSlotManager.Save(game.CreateSlot());
    game.LoadGameSlot(&slot512);
    game.Play();
    game.LoadGameSlot(gameSlotManager.Load());
    game.Play();
    return 0;
}

输出

Play:   state=0
LoadGameSlot:   state=1024
Play:   state=1024
Save:   state=1024
LoadGameSlot:   state=512
Play:   state=512
Load:   state=1024
LoadGameSlot:   state=1024
Play:   state=1024
上一篇 下一篇

猜你喜欢

热点阅读