引言
在软件开发中,我们经常需要实现撤销操作、历史记录或状态回滚等功能。备忘录模式(Memento Pattern)正是为解决这类问题而生的设计模式。今天我们就来深入探讨一下它在 C++ 中的具体实现与应用,希望能帮你掌握这个实用的工具。
备忘录模式概述
备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下捕获并外部化一个对象的内部状态,以便以后可以将该对象恢复到原先保存的状态。该模式特别适合需要实现撤销操作、历史记录或快照功能的场景。
核心角色解析
发起人(Originator)
这是需要保存状态的对象,主要职责包括:
- 负责创建备忘录并记录当前状态
- 可以使用备忘录恢复之前的状态
- 知道如何正确保存和恢复自身状态
备忘录(Memento)
这是存储 Originator 状态的对象,特点如下:
- 存储 Originator 的内部状态
- 提供两个接口:宽接口(Originator 使用)和窄接口(其他对象使用)
- 确保状态的封装性不被破坏
管理者(Caretaker)
负责管理备忘录,其职责是:
- 保存备忘录对象
- 不操作备忘录内容
- 只能通过窄接口与备忘录交互
设计原则体现
备忘录模式很好地体现了多个面向对象设计原则:
- 单一职责原则:将状态保存的职责从 Originator 中分离出来,使 Originator 可以专注于核心业务逻辑。
- 开闭原则:不需要修改 Originator 类就能扩展状态保存功能,通过新增备忘录类实现这一扩展。
- 迪米特法则:Caretaker 不直接操作 Memento 内部细节,有效降低了系统耦合度。
C++ 实现示例
下面是一个具体的 C++ 实现示例,注意其中对内存管理的处理。
#include <iostream>
#include <string>
#include <vector>
// 备忘录类
class Memento {
private:
std::string state; // 只有 Originator 可以访问私有成员
friend class Originator;
Memento(const std::string& s) : state(s) {}
public:
std::string GetState() {
state;
}
};
{
:
std::string state;
:
{
std::cout << << s << std::endl;
state = s;
}
{
(state);
}
{
state = m->();
std::cout << << state << std::endl;
}
};
{
:
std::vector<Memento*> mementos;
Originator* originator;
:
(Originator* orig) : (orig) {}
~() {
( m : mementos)
m;
}
{
mementos.(originator->());
}
{
(mementos.())
;
Memento* m = mementos.();
originator->(m);
mementos.();
m;
}
};
{
Originator originator;
;
originator.();
caretaker.();
originator.();
caretaker.();
originator.();
caretaker.();
caretaker.();
;
}


