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


