UML类图(仅供参考)如下:
备忘录模式解决的问题:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,适当的时候可以让已经改变的对象恢复到之前的状态
源码
#include <string>
#include <iostream>
// 备份类,和需要备份的类一一对应
class CMemento
{
public:
// 备份时调用
void SetStatus(const std::string &sStatus)
{
m_sStatus = sStatus;
}
// 恢复时调用
std::string GetStatus() const
{
return m_sStatus;
}
private:
// 假设这就是需要备份的状态
// 当然可能有很多成员值需要备份
std::string m_sStatus;
};
// 这个类需要备份
// 其实就是备份其中的成员
class COriginator
{
public:
// 改变成员值
void SetStatus(const std::string &sStatus)
{
this->m_sStatus = sStatus;
}
// 创建备份
CMemento CreateMemento()
{
CMemento memento;
memento.SetStatus(m_sStatus);
return memento;
}
// 恢复备份
void RegainMemento(const CMemento &memento)
{
this->m_sStatus = memento.GetStatus();
}
void ShowMemento() const
{
std::cout << "当前的备份为m_sStatus = " << m_sStatus << std::endl;
}
private:
// 需要备份的状态
std::string m_sStatus;
};
// 备份管理类(可有可无)
// 是为了不在客户端暴露备份类
class CCaretaker
{
public:
// 保存备份对象
void SetMemento(const CMemento &memento)
{
m_Memento = memento;
}
// 取出备份对象
CMemento GetMemento() const
{
return m_Memento;
}
private:
// 备份对象
CMemento m_Memento;
};
int main()
{
// 设置初始状态
COriginator originator;
originator.SetStatus("ON");
originator.ShowMemento();
// 保存备份
CCaretaker caretaker;
caretaker.SetMemento(originator.CreateMemento());
// 改变状态
originator.SetStatus("OFF");
originator.ShowMemento();
// 恢复备份
originator.RegainMemento(caretaker.GetMemento());
originator.ShowMemento();
return 0;
}
好处
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节