备忘录模式要求不破坏封装的前提下将对象内的状态保存到对象外,并且可以用这个状态恢复对象。典型应用是游戏的存档机制。
以下代码定义了游戏的存档,假设我们关心的对象状态可以用一个整型数表示。
#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
网友评论