1、意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
2、动机
有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,你必须事先将状态信息保存在某处,这样才能将对象恢复到它们先前的状态。但是对象通常封装了其部分或所有的状态信息,使得其状态不能被其他对象访问,也就不可能在该对象之外保存其状态。而暴露其内部状态又将违反封装的原则,可能有损应用的可靠性的可扩展性。
3、适用性
在以下情况下使用备忘录模式:
1)必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2)如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
4、C++实例
// Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class CRoleStateMemento
{
public:
int m_vit;
int m_def;
int m_atk;
public:
CRoleStateMemento(int vit,int def,int atk)
{
m_atk=atk;
m_def=def;
m_vit=vit;
}
int GetVit()
{
return m_vit;
}
void SetVit(int vit)
{
m_vit=vit;
}
int GetAttack()
{
return m_atk;
}
void SetAttack(int attack)
{
m_atk=attack;
}
int GetDef()
{
return m_def;
}
void SetDef(int def)
{
m_def=def;
}
};
class CGameRole
{
public:
int m_vit;
int m_atk;
int m_def;
public:
int GetVit()
{
return m_vit;
}
void SetVit(int vit)
{
m_vit=vit;
}
int GetAttack()
{
return m_atk;
}
void SetAttack(int attack)
{
m_atk=attack;
}
int GetDef()
{
return m_def;
}
void SetDef(int def)
{
m_def=def;
}
void StateDisplay()
{
cout<<"角色当前状态: "<<endl;
cout<<"体力: "<<m_vit;
cout<<"攻击力: "<<m_atk;
cout<<"防御力: "<<m_def<<endl;
}
public:
void GetInitstate()
{
m_def=100;
m_atk=100;
m_vit=100;
}
void Fight()
{
m_vit=0;
m_atk=0;
m_def=0;
}
public:
CRoleStateMemento* SaveState()
{
return (new CRoleStateMemento(m_vit,m_atk,m_def));
}
void RecoveryState(CRoleStateMemento* memento)
{
m_def=memento->m_def;
m_atk=memento->m_atk;
m_vit=memento->m_vit;
}
};
class CRoleStateCaretaker
{
public:
CRoleStateMemento* m_memento;
public:
CRoleStateMemento* GetMemento()
{
return m_memento;
}
void SetMemento(CRoleStateMemento* memento)
{
m_memento=memento;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CGameRole* pwangyixiao=new CGameRole;
pwangyixiao->GetInitstate();
pwangyixiao->StateDisplay();
CRoleStateCaretaker* pwangyixiaostate=new CRoleStateCaretaker;
pwangyixiaostate->m_memento=pwangyixiao->SaveState();
pwangyixiao->Fight();
pwangyixiao->StateDisplay();
pwangyixiao->RecoveryState(pwangyixiaostate->m_memento);
pwangyixiao->StateDisplay();
delete pwangyixiao;
delete pwangyixiaostate->m_memento;
delete pwangyixiaostate;
return 0;
}