参考:
[备忘录设计模式 (refactoringguru.cn)](https://refactoringguru.cn/design-patterns/mediator)
文章目录
- 一、什么是备忘录模式?
- 二、实现
- 三、优缺点
- 优点
- 缺点
- 四、适用环境
一、什么是备忘录模式?
在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个时间点的状态。如果使用一些公有接口来让其它对象得到对象的状态,便会暴露对象的细节实现。
备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
例如编辑器中保存的内容,可能一些历史修改的快照,用户可以通过撤消恢复历史编辑的内容。
二、实现
备忘录(Memento)模式包含以下主要角色:
1、原发器(Originator):可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。
2、备忘录(Memento):用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问。
3、负责人(Caretaker):负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问。
#include <iostream>
#include <string>
using namespace std;
class Memento
{
string state;
public:
Memento(const string &s) : state(s) {}
string getState() const { return state; }
void setState(const string &s) { state = s; }
};
class Originator
{
string state;
public:
Originator() {}
Mmento creatMemento() { return Memento(state); }
void setMemento(const Memento &m) { state = m.getState(); }
}
int main()
{
Originator originator;
Memento mem = originator.createMemento();
// do something ...
originator.setMemento(memento);
}
三、优缺点
优点
- 可以在不破坏对象封装情况的前提下创建对象状态快照。
- 可以通过让负责人维护原发器状态历史记录来简化原发器代码。
缺点
- 如果客户端过于频繁地创建备忘录, 程序将消耗大量内存。
- 负责人必须完整跟踪原发器的生命周期, 这样才能销毁弃用的备忘录。
四、适用环境
- 当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。
- 当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时,可以使用该模式。