1. 备忘录模式深度解析
备忘录模式(Memento Pattern)是行为型设计模式中的经典之作,它解决了对象状态保存与恢复的核心问题。作为一名长期使用C++进行游戏开发的工程师,我发现这个模式在实际项目中有着不可替代的价值。
1.1 模式本质与三大角色
备忘录模式的精髓在于"状态捕获"与"历史回溯"。它由三个关键角色组成:
-
Originator(原发器):需要保存状态的对象,如游戏角色、文档编辑器等。它负责创建备忘录对象来保存自身状态,也能从备忘录恢复状态。
-
Memento(备忘录):存储原发器内部状态的对象。这个对象的设计需要平衡封装性和可访问性——既要保护内部状态不被随意修改,又要允许原发器在特定情况下访问。
-
Caretaker(管理者):负责保存备忘录对象,但绝不操作或检查其内容。它只提供存储和检索功能,确保状态保存的灵活性。
提示:备忘录模式最精妙的设计在于它对封装性的保护。备忘录对象就像一个时间胶囊,只允许创建它的原发器打开。
1.2 游戏开发中的典型应用
在游戏开发中,我们经常遇到这样的场景:玩家经过艰难战斗后到达检查点,系统需要保存当前游戏状态;或者玩家想尝试不同策略时,需要保存当前进度作为"安全点"。
没有备忘录模式时,新手可能会这样实现:
cpp复制// 反例:将保存逻辑直接混入游戏类
class Game {
// 游戏状态数据...
void saveToFile(const std::string& filename);
void loadFromFile(const std::string& filename);
// 游戏逻辑代码...
};
这种设计违反了单一职责原则,导致代码难以维护。而备忘录模式通过职责分离,让每个类只关注自己的核心功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++实现详解
让我们深入分析提供的C++实现代码,理解每个设计决策背后的考量。
2.1 备忘录类设计
cpp复制class GameMemento {
private:
int level;
int score;
public:
GameMemento(int l, int s) : level(l), score(s) {}
int getLevel() const { return level; }
int getScore() const { return score; }
};
这个备忘录类有几个关键设计点:
- 将数据成员设为private,确保只有原发器(Game类)能通过友元或特定接口访问
- 提供const访问方法,防止外部修改保存的状态
- 保持简单,只存储必要状态(这里只有level和score)
在实际项目中,备忘录可能需要存储更复杂的状态,如玩家装备、地图信息等。这时可以考虑:
- 使用PIMPL模式隐藏实现细节
- 添加序列化/反序列化支持
- 实现差异存储(
