备忘录模式的核心概念
备忘录模式通过"保存"和"加载"两个关键操作实现对象状态的持久化。保存数据是为了后续使用,否则保存就失去意义。历史案例表明,记录历史事件是为了让后世了解真相,若只记录不传播则毫无价值。游戏案例中,保存进度可避免重复挑战困难关卡,体现了备忘录的实际应用价值。
游戏场景示例
玩家通过困难关卡后保存进度,下次游戏可直接从存档点继续。初级程序员可能将所有功能集成在游戏类中,导致类臃肿且难以维护。这种设计违反单一职责原则,将游戏逻辑、数据存储和管理功能混合在一个类中。
模式拆分原则
通过拆分实现功能单一化,提高可扩展性和可维护性。功能单一的类复用性更强,类间耦合度更低。新增需求时只需修改特定类,不影响其他组件。
C++实现示例
游戏数据类(Memento)
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; }
};
游戏类(Originator)
class Game {
private:
int currentLevel;
int currentScore;
public:
Game() : currentLevel(1), currentScore(0) {}
void passLevel() {
currentLevel++;
currentScore += 100;
}
GameMemento save() const {
return GameMemento(currentLevel, currentScore);
}
void load(const GameMemento& memento) {
currentLevel = memento.getLevel();
currentScore = memento.getScore();
}
void displayStatus() const {
std::cout << "Level: " << currentLevel
<< ", Score: " << currentScore << std::endl;
}
};
记录者类(Caretaker)
class GameHistory {
private:
std::vector<GameMemento> saves;
public:
void addSave(const GameMemento& memento) {
saves.push_back(memento);
}
GameMemento getSave(int index) const {
if(index >= 0 && index < saves.size()) {
return saves[index];
}
throw std::out_of_range("Invalid save index");
}
};
模式优势分析
功能分离降低bug出现概率,修改影响范围可控。新增功能只需在对应类中添加,不影响现有结构。记录者类可复用于各种数据保存场景,提高代码复用性。
模式正式定义
在不破坏封装性的前提下,捕获对象内部状态并在外部保存,以便后续恢复。必须遵守面向对象规则,保持数据访问权限合理。实际保存操作由独立记录者类完成,而非数据类自身。必须配套提供状态加载功能,形成完整闭环。
应用场景扩展
游戏存档系统实现进度保存与读取。文本编辑器支持保存/撤销操作。历史著作的记录与传承机制。数据库事务通过保存点实现回滚。版本控制系统管理代码历史记录。
网硕互联帮助中心






评论前必须登录!
注册