設計模式之備忘錄模式Memento
適用範圍:
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。
實例:如遊戲玩家在殺一大怪時,可以進行備份操作,失敗後從備份點重新來做。
備忘錄模式結構圖如下所示:
C++代碼實現如下所示:
1、備忘錄CMemento的實現
//Memento.h
#include <string>
using namespace std;
Class Memento
{
public:
Memento(string state);
virtual ~Memento();
void SetState(string state);
string GetState();
private:
string m_state;
}
//Memento.cpp
#include "Memento.h"
CMemento::CMemento(string state)
{
m_state = state;
}
CMemento::~CMemento()
{
}
void CMemento::SetState(string state)
{
m_state = state;
}
string CMemento::GetState()
{
return m_state;
}
2、備份類CCaretaker
//Caretaker.h
#include "Memento.h"
Class CCaretaker
{
public:
CCaretaker();
virtual ~CCaretaker();
void SetMemento(CMemento *m);
CMemento *GetMemento();
private:
CMemento *m_memento;
}
//Caretaker.cpp
#include "Caretaker.h"
CCaretaker::CCaretaker()
{
}
CCaretaker::~CCaretaker()
{
}
void CCaretaker::SetMemento(CMemento *m)
{
m_memento = m;
}
CMemento *CCaretaker::GetMemento()
{
return m_menmento;
}
3、COrigitor的實現:
Class COrigitor
{
public:
COrigitor();
virtual ~COrigitor();
void SetState(string state);
string GetState();
void SetMemento(CMemento *m);
CMemento *GetMemento();
void Show();
private:
string state;
}
//Origitor.cpp
#include "Origitor.h"
COrigitor::COrigitor()
{
}
COrigitor::~COrigitor()
{
}
void COrigitor::SetState(string state)
{
m_state = state;
}
string COrigitor::GetState()
{
return m_state;
}
void COrigitor::SetMemento(CMemento *m)
{
m_state = m->GetState();
}
CMemento *COrigitor::CreateMemento()
{
return new CMemento(m_state);
}
void CMemento::Show()
{
cout<<m_state<<endl;
}
4、客戶端代碼main.cpp
#include <iostream.h>
#include "Memento.h"
#include "Caretaker.h"
#include "Origitor.h"
#include <string>
using namespace std;
COrigitor o;
o.SetState("ON");
cout<<"初始化時狀態:";
o.Show();
//備份
CCaretaker care;
CMemento *m = o.CreateMemento();
care.SetMemento(m);
o.SetState("OFF");
cout<<"修改後狀態:";
o.Show();
//恢復狀態
o.SetMemento(care.GetMemento());
cout<<"恢復後的狀態:";
o.Show();
//釋放內存
if(m != NULL)
{
delete m;
}
以上,僅供參考。