设计模式之备忘录模式-把我放在你的关注里,备份一下啊!
备忘录模式
一、备忘录模式的概念
备忘录模式属于行为模式,它保存对象的内部状态,并在需要的时候恢复对象以前的状态。
二、备忘录模式使用场景
1、当需要保存和恢复对象的内部状态时,可以使用备忘录模式。
2、当需要提供一个可回滚的操作时,可以使用备忘录模式,典型应用就是撤销恢复快捷键Ctrl+z。
三、备忘录模式构建方法
1、原生者类(Originator)
需要被保存和恢复的对象类
2、备忘录类(Memento)
主要用来保存原生者类的内部状态,对象由原生者类创建。
3、管理者类(Caretaker)
主要负责在适当的时间保存和恢复原生者对象的状态。
四、备忘录模式的示例
// MementoPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#include <list>
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
using namespace std;
// 备忘录模式-备份类
class MementoInfo
{
public:
MementoInfo(string messageStr)
{
m_messageStr = messageStr;
}
string getMessage()
{
return m_messageStr;
}
private:
string m_messageStr;
};
// 备忘录模式-原生者类
class OriginInfo
{
public:
void sendMessage(string messageStr)
{
m_messageStr = messageStr;
cout << "发送信息:" << messageStr << endl;
}
// 保存原生者的数据到备份中
MementoInfo *saveInfo()
{
cout << "备份数据:" << m_messageStr << endl;
return new MementoInfo(m_messageStr);
}
// 恢复备份数据
void restoreInfo(MementoInfo *pMementoInfo)
{
if (pMementoInfo != nullptr)
{
m_messageStr = pMementoInfo->getMessage();
cout << "恢复数据:" << m_messageStr << endl;
}
}
private:
string m_messageStr;
};
// 备忘录模式-管理类
class CaretakerInfo
{
public:
CaretakerInfo()
{
m_mementoList.clear();
}
~CaretakerInfo()
{
for (auto iter : m_mementoList)
{
DELETE_PTR(iter);
}
m_mementoList.clear();
}
// 返回备份数据
MementoInfo *getMementoInfo()
{
return m_mementoList.back();
}
// 添加备份数据
void addMementoInfo(MementoInfo *pMementoInfo)
{
if (pMementoInfo != nullptr)
{
m_mementoList.push_back(pMementoInfo);
}
}
private:
list<MementoInfo*> m_mementoList;// 存储备份数据列表
};
int main()
{
cout << "-------------------------备忘录模式--------------------------" << endl;
CaretakerInfo *pCaretakerInfo = new CaretakerInfo();
OriginInfo *pOriginInfo = new OriginInfo();
pOriginInfo->sendMessage("你好啊!我是一个:爱人生,爱微笑,爱分享的程序猿!欢迎关注哦!");
pCaretakerInfo->addMementoInfo(pOriginInfo->saveInfo());
pOriginInfo->restoreInfo(pCaretakerInfo->getMementoInfo());
DELETE_PTR(pCaretakerInfo);
DELETE_PTR(pOriginInfo);
std::cout << "Hello World!\n";
getchar();
}
运行结果:
五、备忘录模式的优缺点
优点:
1、提供了一种回滚机制,可以使用户能够方便地恢复某个历史的状态。
2、封装了信息实现,使得用户不需要关心状态的保存细节。
缺点:
消耗资源,如果对象的成员变量过多,会占用比较大的资源,而且每一次保存都会消耗一定的内存。
能力有限,如有错误,多多指教。。。
本文为博主原创文章,未经博主允许请勿转载!作者:ISmileLi