概念
备忘录模式是一种行为模式的设计模式,这种模式的核心思想是在破坏封装性的前提下,捕获并外部化一个对象的内部状态 进行对象快照的备份。以便以后可以将该对象恢复到原先保存的状态。备忘录模式通常用于实现撤销操作或状态恢复功能。
备忘录模式是通过引入一个备忘录对象来存储另一个对象的内部状态,原始对象(发起人)可以在需要时将自己的状态保存到备忘中,并在以后从备忘录中恢复状态。
适用场景
1、撤销操作和状态恢复:当需要创建对象状态的快照来恢复之前的状态时,可以使用备忘录模式。
2、当直接访问对象的成员变量的时需要打破对象的封装从而获取变量快照的时候,可以使用此模式。
实现方式
1、在使用备忘录模式的时候需要使用三个类,备忘录类、操作类、发起类。
2、创建备忘录类接口,声明获取数据函数、声明获取状态的函数(逐一声明对应每个发起类成员变量的备忘录成员变量,获取数据函数和获取状态函数可以声明一个,只要能满足备忘录备份的需求即可)。将备忘录类设为不可变。 备忘录只能通过构造函数一次性接收数据。 该类中不能包含设置器。
3、创建实际的备忘录类,需要实现备忘录类的接口函数和需要存储状态的对象。
4、实现发起类,在此类中需要实现一个快照函数和恢复状态的函数,此函数也是备忘录模式的主要操作,通过此函数可以完整的将所需要所有状态进行备份快照。并返回快照数据(备忘录对象)。
5、创建操作类,操作类主要是用于操作备忘录,并且备忘录只能由操作类进行操作。在操作类中需要创建一个备忘录容器用于存储存储备忘录中的快照。并且在操作类中实现备忘录容器的操作实现获取、删除、添加的操作。
6、在使用的过程中首先创建一个操作类、具体的备忘录类和发起类类。在需要添加的时候用需要快照的类中通过快照函数创建一个快照对象,之后在将添加到操作类。
类关系图
示例代码
#include "BeiWangLuMoshi.h"int main()
{std::cout << "欢迎东哥来到设计模式的世界!\n";Manage* manage = new Manage();Launch* launch = new Launch();launch->setDate("第一次输入", "编辑");manage->addBackup(launch->backups());launch->setDate("第二次输入", "编辑");manage->addBackup(launch->backups());launch->setDate("第三次输入", "编辑");manage->addBackup(launch->backups());launch->setDate("第四次输入", "编辑");manage->addBackup(launch->backups());for (int i = manage->size() - 1; i >= 0; --i) {Backups* backup = manage->getBackup();launch->restoreBackup(backup);manage->delBackup();launch->display();}
}
#pragma once
#include <string>
#include <iostream>
#include <vector>using namespace std;//具体备忘录类,接口类省略
class Backups
{
public:Backups(string date,string state) {m_date = date;m_state = state;}~Backups() {}string getDate() {return m_date;}string getState() {return m_state;}
private:string m_date;string m_state;
};//发起类
class Launch {
public://备份函数Backups* backups() {Backups* backup = new Backups(m_date,m_state);return backup;}//恢复备份函数void restoreBackup(Backups* backup) {this->m_date = backup->getDate();this->m_state = backup->getState();}//设置数据void setDate(string date, string state) {this->m_date = date;this->m_state = state;}void display() {cout << "Date: " << m_date << " State: " << m_state << endl;}
private:string m_date;string m_state;
};//操作类
class Manage {
public:Manage() {}~Manage() {}void addBackup(Backups* backup) {if (backup) {m_vBackups.push_back(backup);}}void delBackup() {if (m_vBackups.size() > 0) {delete m_vBackups[m_vBackups.size() - 1];m_vBackups.pop_back();}}Backups* getBackup() {if (m_vBackups.size() > 0) {return m_vBackups[m_vBackups.size() - 1];}}int size() {return m_vBackups.size();}private:vector<Backups*> m_vBackups;
};
欢迎东哥来到设计模式的世界!
Date: 第四次输入 State: 编辑
Date: 第三次输入 State: 编辑
Date: 第二次输入 State: 编辑
Date: 第一次输入 State: 编辑