简介
备忘录模式(Memento Pattern)是一种行为型设计模式,它用于保存和恢复对象的状态。备忘录模式通过将对象的状态封装成一个备忘录(Memento),并将备忘录保存在一个管理者(Caretaker)中,来实现对对象状态的保存和恢复。
备忘录模式的核心思想是将对象的状态封装成一个备忘录对象,而不是直接暴露状态给其他对象。这样,其他对象就无法直接操作对象的状态。同时,备忘录模式还提供了一个管理者对象,用于保存和管理备忘录,可以实现对对象状态的保存和恢复。
描述
备忘录模式由三个核心组件组成:Originator(原始对象)、Memento(备忘录和Caretaker(管理者)。
- Originator类保存了需要保存状态的对象,并能够根据当前状态创建备忘录和从备忘录中恢复原始状态。
- Memento类是备忘录对象,负责保存Originator对象的状态。
- Caretaker类是管理者对象,负责保存备忘录对象,提供了对备忘录的保存、获取和恢复功能。
原理
备忘录模式通过将对象的状态保存在备忘录对象中,将备忘录对象保存在管理者对象中,来实现对对象状态的保存和恢复。当需要保存当前状态时,Originator对象会创建一个包含状态的备忘录对象,并将备忘录对象交给Caretaker对象保存。当需要恢复到之前的状态时,Originator对象会从Caretaker对象获取对应的备忘录对象,并根据备忘录对象中保存的状态恢复原始状态。
1.创建一个备忘录,该类用于存储原发器的状态。
2.创建一个原发器类,该类拥有需要保存和恢复的状态,并提供保存状态和恢复状态的方法。
3.创建一个管理者类,用于管理备忘录对象的保存和获取。
4.在需要保存原发器状态的时候,原发器创建一个备忘录对象,并将自己的状态传递给备忘录对象。
5.管理者对象保存备忘录对象。
6.在需要恢复原发器状态的时候,管理者对象将备忘录对象交还给原发器。
类图
示例
假设有一个文本编辑器,用户可以输入文本并进行编辑操作。当用户希望撤销一些编辑操作时,可以使用备忘录模式保存编辑器状态。
在示例中,有三个主要类:
- Editor(原发器):表示文本编辑器,具有保存和恢复状态的方法,以及一个用于保存和获取备忘录的方法。
- EditorState(备忘录):表示编辑器的状态,保存了编辑器的文本内容。
- EditorHistory(管理者):管理备忘录对象的保存和获取。
C++示例代码:
#include <iostream>
#include <stack>
#include <string>// 备忘录
class Memento {
public:Memento(const std::string& text) : text(text) {}std::string getText() const {return text;}private:std::string text;
};// 原始对象
class TextEditor {
public:void setText(const std::string& text) {this->text text;}Memento createMemento() {return Memento(text);}void restoreFromMemento(const Memento& memento) {text = m.getText();}void printText() {stdcout << text << std::endl;}private:std::string text;
};// 管理者
class Caretaker {
public:void saveMemento(const Memento& memento){mementos.push(memento);}Memento getMemento() {if (!mementos.empty()) {Memento memento = mementos.top();mementos.pop();return memento;} else {return Memento("");}}private:std::stack<Memento> mementos;
};int main() {TextEditor editor;Caretaker caretaker;// 设置初始文本editor.setText("Hello, World!");// 保存文本状态caretaker.saveMemento(editor.createMemento());// 修改文本editor.setText("Hello, Memento!");// 打印当前文本std::cout << "Current Text: ";editor.printText();// 恢复到之前的状态Memento m = caretaker.getMemento();editor.restoreFromMemento(memento);// 再次打印文本std::cout << "Restored Text: ";editor.printText();return 0;
}
输出结果
Current Text: Hello, Memento!Restored Text: Hello, World!
解释
在上述示例中,TextEditor类是原始对象(Originator),它保存了需要保存状态的文本,并提供了创建备忘录和从备忘录中恢复状态的方法。Memento类是备忘录(Memento),它负责保存TextEditor对象的状态。Caretaker类是管理者(Caretaker),它负责保存备忘录对象,并提供了对备忘录的保存和获取功能。
首先设置初始文本为"Hello, World!“,并保存初始状态。然后,我们修改文本为"Hello, Memento Pattern!”,并打印当前文本。接下来,我们从Caretaker对象获取之前保存的备忘录对象,并将文本恢到之前的状态。最后,再次打印文本,可以看到文本已经恢复为之前保存的状态。
结论
备忘录模式通过将对象的状态保存到备忘录对象中,并在的时候将其恢复,实现了对对象状态的保存和恢复功能,同时保持了对象的封装性。该模式可以用于需要可撤销操作或历史记录功能的场景。
应用场景
- 需要保存和恢复对象状态的场景,例如文本编辑器、操作撤销功能等。
- 需要实现多级撤销操作的场景,例如图形编辑器中的多层次撤销操作。
- 需要保存对象历史记录的场景,例如编辑器的编辑历史记录。
- 需要实现对象副本功能的场景,在特定时候将对象恢复到某个历史状态。
总之,备忘录模式提供了一种简单且有效的方法来保存和恢复对象的状态,可以在需要保存对象状态的场景中很好地发挥作用。