美文网首页
设计模式-行为模式-备忘录模式

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

作者: 阿棍儿_Leon | 来源:发表于2020-04-30 09:33 被阅读0次

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

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

    #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
    

    相关文章

      网友评论

          本文标题:设计模式-行为模式-备忘录模式

          本文链接:https://www.haomeiwen.com/subject/jvvawhtx.html