设计模式之备忘录模式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;
}
以上,仅供参考。