备忘录模式(Memento)
备忘录模式是一种行为型设计模式,用于在不暴露对象内部状态的情况下,保存和恢复对象的状态。它使得可以在对象状态改变时保存其原始状态,并在需要时恢复到之前的状态。这对于实现撤销操作、恢复状态等功能非常有用。
1. 备忘录模式的结构
备忘录模式包含以下几个主要组件:
- Memento(备忘录): 存储对象的内部状态。备忘录对象只能由发起人对象访问,确保状态的安全性。
- Originator(发起人): 创建备忘录对象并使用备忘录对象恢复自身的状态。发起人对象维护其内部状态,并能够保存和恢复状态。
- Caretaker(看护者): 负责保存和管理备忘录对象,但不直接操作备忘录的内容。看护者对象可以请求备忘录的保存和恢复,但不关心备忘录的内部实现。
2. Mermaid 关系图
以下是备忘录模式的类图,用 Mermaid 表示:
classDiagram class Memento { - state : std::string + getState() : std::string } class Originator { - state : std::string + createMemento() : Memento + restoreMemento(memento : Memento) : void } class Caretaker { - memento : Memento + saveMemento(memento : Memento) : void + getMemento() : Memento } Originator --> Memento : "创建" Originator --> Memento : "恢复" Caretaker --> Memento : "管理"
3. 备忘录模式的实现
Memento 备忘录:
class Memento {
private:
std::string state;
public:
Memento(const std::string& state) : state(state) {}
std::string getState() const {
return state;
}
};
Originator 发起人:
#include <iostream>
class Originator {
private:
std::string state;
public:
void setState(const std::string& state) {
this->state = state;
}
std::string getState() const {
return state;
}
Memento createMemento() const {
return Memento(state);
}
void restoreMemento(const Memento& memento) {
state = memento.getState();
}
};
Caretaker 看护者:
class Caretaker {
private:
Memento memento;
public:
void saveMemento(const Memento& memento) {
this->memento = memento;
}
Memento getMemento() const {
return memento;
}
};
Client 客户端代码:
int main() {
Originator originator;
Caretaker caretaker;
originator.setState("State1");
std::cout << "Originator current state: " << originator.getState() << std::endl;
// Save state to memento
caretaker.saveMemento(originator.createMemento());
// Change state
originator.setState("State2");
std::cout << "Originator current state: " << originator.getState() << std::endl;
// Restore state from memento
originator.restoreMemento(caretaker.getMemento());
std::cout << "Originator restored state: " << originator.getState() << std::endl;
return 0;
}
4. 使用备忘录模式
在客户端代码中,创建发起人对象并设置其状态。将发起人的状态保存到备忘录中,然后修改发起人的状态。使用看护者保存和恢复备忘录对象,从而可以在需要时恢复到之前的状态。
5. 总结
备忘录模式通过提供一个机制来保存和恢复对象的内部状态,而不暴露其内部结构,从而使得系统能够实现状态的撤销和恢复功能。Mermaid 类图展示了备忘录、发起人、看护者以及它们之间的关系,帮助理解模式的结构和实现。