设计模式之备忘录模式-把我放在你的关注里,备份一下啊!

一、备忘录模式的概念

备忘录模式属于行为模式,它保存对象的内部状态,并在需要的时候恢复对象以前的状态。

二、备忘录模式使用场景

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、封装了信息实现,使得用户不需要关心状态的保存细节。

缺点:

消耗资源,如果对象的成员变量过多,会占用比较大的资源,而且每一次保存都会消耗一定的内存。

能力有限,如有错误,多多指教。。。

posted @ 2020-03-04 21:14  ISmileLi  阅读(1)  评论(0编辑  收藏  举报