备忘录模式是一种行为型设计模式,它允许将对象的内部状态保存在外部对象中,并在需要时恢复该状态。备忘录模式可以用于实现撤销、恢复、快照等应用。
下面是一个使用 C++ 实现备忘录模式的示例代码:
#include <iostream>
#include <string>
#include <vector>
// 备忘录类:保存状态
class Memento {
public:
Memento(const std::string& state) : state_(state) {}
const std::string& GetState() const {
return state_;
}
private:
std::string state_;
};
// 发起人类:保存状态、创建备忘录、恢复状态
class Originator {
public:
void SetState(const std::string& state) {
state_ = state;
}
const std::string& GetState() const {
return state_;
}
Memento* CreateMemento() const {
return new Memento(state_);
}
void RestoreMemento(const Memento* memento) {
state_ = memento->GetState();
}
private:
std::string state_;
};
// 管理者类:保存备忘录、恢复备忘录
class Caretaker {
public:
void AddMemento(Memento* memento) {
mementos_.push_back(memento);
}
Memento* GetMemento(int index) const {
return mementos_[index];
}
void RestoreMemento(int index, Originator* originator) {
originator->RestoreMemento(mementos_[index]);
}
private:
std::vector<Memento*> mementos_;
};
int main() {
// 创建发起人对象
Originator originator;
// 修改状态
originator.SetState("State 1");
std::cout << "Current state: " << originator.GetState() << std::endl;
// 创建备忘录
Memento* memento1 = originator.CreateMemento();
// 修改状态
originator.SetState("State 2");
std::cout << "Current state: " << originator.GetState() << std::endl;
// 创建备忘录
Memento* memento2 = originator.CreateMemento();
// 创建管理者对象
Caretaker caretaker;
// 保存备忘录
caretaker.AddMemento(memento1);
caretaker.AddMemento(memento2);
// 恢复备忘录
caretaker.RestoreMemento(0, &originator);
std::cout << "Current state after restoring memento 1: " << originator.GetState() << std::endl;
caretaker.RestoreMemento(1, &originator);
std::cout << "Current state after restoring memento 2: " << originator.GetState() << std::endl;
return 0;
}
在上面的代码中,我们首先定义了一个 Memento 类,用于保存对象的状态。发起人类 Originator 保存对象的状态,并可以创建备忘录和恢复状态。管理者类 Caretaker 保存备忘录,并可以恢复备忘录。在 main() 函数中,我们创建一个发起人对象 originator,修改它的状态,并创建了两个备忘录。接着,我们创建了一个管理者对象 caretaker,并将备忘录保存到其中。最后,我们从管理者对象中恢复备忘录,并观察输出结果。
备忘录模式的优点在于它可以隔离对象的内部状态,并将状态保存在外部对象中,从而避免了对象暴露其内部状态给其他对象。同时,备忘录模式也提供了一种撤销、恢复等操作的机制,使得系统更加灵活。但是,由于备忘录对象需要保存对象的状态,因此它可能会占用大量的内存空间。