备忘录模式详解
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这些状态。这样以后就可以把这些状态重新恢复到对象中。
模式动机
备忘录模式主要解决的是在给对象添加历史状态保存与恢复功能的问题,这通常会涉及到大量对象的行为记录、状态存储以及状态恢复等功能,用类似“快照”的方式进行保存。
模式结构
备忘录模式包含以下主要角色:
- Originator(发起人角色):负责创建一个备忘录对象,用以存储当前时刻的对象内部状态;
- Memento(备忘录角色):存储发起人的内部状态,并防止发起人以外的其他对象操作这些内部状态;
- Caretaker(管理者角色):对备忘录进行管理,用于给出一个统一的接口,让外界能够对备忘录进行访问,但不能对备忘录的内容进行操作。
应用场景
备忘录模式的应用场景主要包括但不限于:
- 编辑器撤销功能实现;
- 游戏存档功能实现;
- 事务回滚机制的设计等。
示例代码
// 备忘录类
class Memento {
private:
std::string state;
public:
Memento(const std::string& s) : state(s) {}
std::string getState() const { return state; }
};
// 发起人类
class Originator {
private:
std::string state;
public:
void setState(const std::string& s) { state = s; }
Memento* createMemento() { return new Memento(state); }
void restoreMemento(Memento* m) { state = m->getState(); }
};
// 管理者类
class Caretaker {
private:
std::vector<Memento*> mementos;
public:
void addMemento(Memento* m) { mementos.push_back(m); }
Memento* getMemento(size_t index) { return mementos[index]; }
};
int main() {
Originator originator;
Caretaker caretaker;
originator.setState("State #1");
caretaker.addMemento(originator.createMemento());
originator.setState("State #2");
caretaker.addMemento(originator.createMemento());
originator.setState("State #3");
caretaker.addMemento(originator.createMemento());
// 恢复到第二个状态
originator.restoreMemento(caretaker.getMemento(1));
std::cout << "Current State: " << originator.getState() << std::endl;
return 0;
}
总结
通过备忘录模式,我们可以在不影响对象封装性的同时,实现对象状态的备份和恢复,这对于需要撤销功能的应用场景非常有用。此外,备忘录模式还可以避免在对象之间传递复杂状态对象,提高系统的灵活性。
📚 本文介绍了备忘录模式的概念、结构及其应用场景,并提供了详细的代码示例,帮助你更好地理解和运用这一设计模式。