備忘錄模式要求不破壞封裝的前提下將對象內(nèi)的狀態(tài)保存到對象外,并且可以用這個狀態(tài)恢復對象。典型應用是游戲的存檔機制。
以下代碼定義了游戲的存檔,假設(shè)我們關(guān)心的對象狀態(tài)可以用一個整型數(shù)表示。
#include <iostream>
using namespace std;
class Slot
{
private:
int m_state;
public:
Slot(int state):m_state(state){}
int GetState()
{
return m_state;
}
};
以下代碼定義了游戲類,也就是這個模式所關(guān)心的對象,它可以用當前狀態(tài)創(chuàng)建存檔,也能應用存檔覆蓋當前游戲狀態(tài)。
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;
}
};
以下代碼模擬了一個玩游戲的過程。
首先創(chuàng)建存檔管理器和游戲,然后創(chuàng)建了兩個存檔(512和1024)。
先未加載存檔進行游戲,然后加載1024存檔游戲,并進行游戲,然后保存游戲創(chuàng)建的存檔。
接下來加載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