一、备忘录模式介绍
备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
二、示例场景
假设有一个文本编辑器,用户可以在其中输入文本,并随时保存当前的文本状态,以便在需要时恢复到之前的状态。
三、具体实现
定义备忘录类(Memento):
cpp
class TextMemento {
public:
TextMemento(const std::string& text) : text(text) {}
std::string getText() const { return text; }
private:
std::string text;
};
这个类用于存储文本编辑器的状态,即文本内容。
定义原发器类(Originator):
cpp
class TextEditor {
public:
void setText(const std::string& newText) { text = newText; }
TextMemento save() { return TextMemento(text); }
void restore(const TextMemento& memento) { text = memento.getText(); }
std::string getText() const { return text; }
private:
std::string text;
};
原发器类代表文本编辑器,它有设置文本、保存当前状态为备忘录以及从备忘录恢复状态的方法。
定义管理者类(Caretaker):
cpp
class Caretaker {
public:
void addMemento(const TextMemento& memento) { mementos.push_back(memento); }
TextMemento getMemento(int index) const { return mementos[index]; }
private:
std::vector<TextMemento> mementos;
};
管理者类用于存储多个备忘录对象,以便在需要时获取特定的备忘录来恢复文本编辑器的状态。
使用这些类:
cpp
int main() {
TextEditor editor;
Caretaker caretaker;
editor.setText("Hello, world!");
caretaker.addMemento(editor.save());
editor.setText("Goodbye!");
caretaker.addMemento(editor.save());
editor.restore(caretaker.getMemento(0));
std::cout << "Restored text: " << editor.getText() << std::endl;
return 0;
}
在主函数中,创建了一个文本编辑器和一个管理者对象。首先设置文本内容并保存状态到管理者中,然后再次设置文本内容并保存状态。最后,恢复到第一个保存的状态并输出恢复后的文本内容。
通过这个例子,可以看到备忘录模式使得在不暴露对象内部结构的情况下,能够方便地保存和恢复对象的状态。