1. 备忘录模式的核心概念
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时能够恢复到原先保存的状态。这种模式特别适用于需要实现撤销/重做功能的场景。
在C++中实现备忘录模式时,通常会涉及三个关键角色:
- Originator(原发器):负责创建备忘录对象以记录当前时刻的内部状态,并可以使用备忘录恢复内部状态
- Memento(备忘录):存储原发器的内部状态
- Caretaker(管理者):负责保存备忘录,但不能对备忘录的内容进行操作或检查
重要提示:备忘录模式的核心价值在于它实现了状态保存与恢复的职责分离,同时保持了对象的封装性。这意味着Originator的状态细节不会暴露给Caretaker。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++备忘录模式的实现细节
2.1 基础类结构设计
让我们先来看一个完整的C++实现示例。以下代码展示了备忘录模式的基本框架:
cpp复制#include <iostream>
#include <string>
#include <vector>
#include <ctime>
// 备忘录接口
class Memento {
public:
virtual ~Memento() = default;
virtual std::string GetName() const = 0;
virtual std::string GetDate() const = 0;
virtual std::string GetState() const = 0;
};
// 具体备忘录
class ConcreteMemento : public Memento {
private:
std::string state_;
std::string date_;
public:
ConcreteMemento(std::string state) : state_(std::move(state)) {
std::time_t now = std::time(nullptr);
date_ = std::ctime(&now);
}
std::string GetState() const override {
return state_;
}
std::string GetName() const override {
return date_ + " / (" + state_.substr(0, 9) + "...)";
}
std::string GetDate() const override {
return date_;
}
};
2.2 Originator的实现
Originator类负责业务逻辑和状态管理,它提供了创建备忘录和从备忘录恢复状态的方法:
cpp复制class Originator {
private:
std::string state_;
std::string GenerateRandomString(int length = 10) {
const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
const int stringLength = sizeof(alphanum) - 1;
std::string random_string;
for (int i = 0; i < length; ++i) {
random_string += alphanum[std::rand() % stringLength];
}
return random_string;
}
public:
explicit Originator(std::string state) : state_(std::move(state)) {
std::cout << "Originator: Initial state is: " << state_ << "\n";
}
void DoSomething() {
std::cout << "Originator: Performing important operation...\n";
state_ = GenerateRandomString(30);
std::cout << "Originator: State changed to: " << state_ << "\n";
}
Memento* Save() {
return new ConcreteMemento(state_);
}
void Restore(Memento* memento) {
state_ = memento->GetState();
std::cout << "Originator: State restored to: " << state_ << "\n";
delete memento;
}
};
2.3 Caretaker的实现
Caretaker类负责管理备忘录的历史记录,但不直接操作备忘录内容:
cpp复制class Caretaker {
private:
