C++ 备忘录模式实战:对象状态保存与恢复
在开发过程中,我们常会遇到需要撤销操作、历史记录或状态回滚的场景。备忘录模式(Memento Pattern)正是解决这类问题的经典方案。它允许在不破坏封装性的前提下,捕获并外部化对象的内部状态,以便后续恢复。
核心角色解析
实现备忘录模式主要涉及三个角色,理解它们的职责是上手的关键。
1. Originator(发起人)
这是需要保存状态的对象。它负责创建备忘录并记录当前状态,同时也能利用备忘录恢复到之前的状态。简单来说,它是状态的拥有者。
2. Memento(备忘录)
这是存储状态的容器。它有两个接口:宽接口供 Originator 使用以存取数据,窄接口供其他对象使用仅用于读取。这种设计确保了状态细节的封装性不被破坏。
3. Caretaker(管理者)
负责管理备忘录对象,比如保存列表。关键点在于,Caretaker 不操作备忘录内容,只能通过窄接口交互,避免越权访问。
设计原则体现
这个模式很好地体现了几个面向对象原则:
- 单一职责:将状态保存从业务逻辑中剥离,Originator 更专注核心功能。
- 开闭原则:扩展保存功能无需修改 Originator,新增备忘录类即可。
- 迪米特法则:Caretaker 不直接触碰 Memento 内部细节,降低耦合。
C++ 实现示例
下面是一个完整的 C++ 实现。注意这里使用了友元机制来保证 Memento 对 Originator 的可见性,同时通过窄接口限制外部访问。
#include <iostream>
#include <string>
#include <vector>
// 备忘录类
class Memento {
private:
std::string state;
// 只有 Originator 可以访问私有成员
friend class Originator;
Memento(const std::string& s) : state(s) {}
std::string GetState() const { return state; }
};
// 发起人类
class Originator {
private:
std::string state;
public:
{
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.();
;
}


