定义
备忘录模式(Memento Pattern)是一种对象行为型模式,又叫快照模式,别名为Token。这种模式允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。备忘录模式的发起人(Originator)角色会记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能。备忘录(Memento)角色负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。管理者(Caretaker)角色对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
实现举例
- 用Originator类来表示要保存和恢复状态的对象。这个类定义了如何创建备忘录(即保存状态),以及如何从备忘录中恢复状态。
c++
#include <iostream>
#include <string>
// 原发器类
class Originator {
public:
// 定义一些可能会随时间变化的重要数据
std::string state;
// 创建一个新的备忘录
Memento createMemento() {
return Memento(state);
}
// 从备忘录中恢复状态
void restoreFromMemento(Memento m) {
state = m.getState();
}
// 改变原发器的状态
void setState(std::string newState) {
std::cout << "State changed to: " << newState << std::endl;
state = newState;
}
private:
// 省略其他私有成员变量和方法
};
// 备忘录接口
class Memento {
public:
virtual ~Memento() {}
virtual std::string getState() const = 0;
};
// 具体的备忘录类
class ConcreteMemento : public Memento {
public:
ConcreteMemento(const std::string& state)
: state_(state) {}
std::string getState() const override {
return state_;
}
private:
std::string state_;
};
- 用Caretaker类来管理和存储备忘录。这个类通常包含一个栈或其他数据结构来保存备忘录,并可以使用这些备忘录来恢复原发器的状态。
c++
cpp
#include <stack>
// 管理者类
class Caretaker {
public:
void setMemento(Memento* memento) {
mementos_.push(memento);
}
Memento* getMemento() {
if (!mementos_.empty()) {
auto memento = mementos_.top();
mementos_.pop();
return memento;
}
return nullptr;
}
private:
std::stack<Memento*> mementos_;
};
- 简单的测试程序来演示备忘录模式的用法。
c++
cpp
int main() {
Originator originator;
Caretaker caretaker;
// 设置初始状态
originator.setState("State 1");
std::cout << "Current state: " << originator.state << std::endl;
// 创建第一个备忘录
Memento* memento1 = originator.createMemento();
// 更改状态
originator.setState("State 2");
std::cout << "Current state: " << originator.state << std::endl;
// 创建第二个备忘录
Memento* memento2 = originator.createMemento();
// 恢复到第一个备忘录的状态
caretaker.setMemento(memento2);
originator.restoreFromMemento(*caretaker.getMemento());
std::cout << "Current state after restoring from second memento: "
<< originator.state << std::endl;
// 恢复到原始状态
caretaker.setMemento(memento1);
originator.restoreFromMemento(*caretaker.getMemento());
std::cout << "Current state after restoring from first memento: "
<< originator.state << std::endl;
delete memento1;
delete memento2;
return 0;
}
总结
备忘录模式是一种对象行为型模式,其主要优点如下:
- 提供了一种可以恢复状态的机制,当用户需要时能够比较方便地将数据恢复到某个历史的状态。
- 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
- 简化了发起人类,发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。