目录
备忘录模式(Memento Pattern)是一种【行为型】设计模式,它允许在不破坏对象封装性的前提下,捕获并保存对象的内部状态,以便后续可以将对象恢复到先前的状态。这种模式通过将状态保存和恢复操作分离,实现了对象状态管理的职责分离。
一、模式核心概念与结构
备忘录模式包含三个核心角色:
- 原发器(Originator):创建备忘录并使用备忘录恢复内部状态的对象。
- 备忘录(Memento):存储原发器内部状态的对象,通常提供有限的访问权限。
- 管理者(Caretaker):负责保存备忘录,但不检查或修改备忘录的内容。
二、C++ 实现示例:文本编辑器撤销功能
以下是一个简单的文本编辑器示例,演示如何使用备忘录模式实现撤销功能:
#include <iostream>
#include <string>
#include <memory>
#include <vector>
// 前向声明
class Memento;
// 原发器:文本编辑器
class TextEditor {
private:
std::string content;
public:
void setContent(const std::string& text) {
content = text;
std::cout << "Current content: " << content << std::endl;
}
std::string getContent() const {
return content;
}
// 创建备忘录
std::shared_ptr<Memento> createMemento() const;
// 从备忘录恢复
void restoreFromMemento(std::shared_ptr<Memento> memento);
};
// 备忘录
class Memento {
private:
std::string savedContent;
public:
Memento(const std::string& content) : savedContent(content) {
}
// 仅供原发器访问的内部状态
friend class TextEditor;
};
// 实现原发器的方法
std::shared_ptr<Memento> TextEditor::createMemento() const {
return std::make_shared<Memento>(content);
}
void TextEditor::restoreFromMemento(std::shared_ptr<Memento> memento) {
content = memento->savedContent;
std::cout << "Restored content: " << content << std::endl;
}
// 管理者:历史记录
class History {
private:
std::vector<std::shared_ptr<Memento>> mementos;
public:
void saveState(std::shared_ptr<Memento> memento) {
mementos.push_back(memento);
std::cout << "State saved. History size: " << mementos.size() <<