定义与概念
备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下捕获和保存一个对象的内部状态,以便之后可以将对象恢复到该状态。这个模式就像是为对象的某个时刻的状态拍了一张 “快照”,之后可以根据这张 “快照” 让对象回到当时的状态。
结构组成
- 原发器(Originator):
这是需要保存和恢复状态的对象。它创建一个备忘录对象来保存自己的当前状态,并可以使用备忘录对象来恢复状态。例如,在一个文本编辑器中,文档对象就是原发器,它可以保存文档的当前内容、格式等状态信息到备忘录中,也可以从备忘录中恢复这些状态。 - 备忘录(Memento):
备忘录对象用于存储原发器的内部状态。它是一个内部状态的存储载体,并且要防止原发器以外的对象访问备忘录的内部状态,以保证封装性。在文本编辑器的例子中,备忘录可能是一个包含文档内容和格式信息的数据结构,它只提供给原发器访问这些信息的接口。 - 负责人(Caretaker):
负责人对象负责保存备忘录对象,但它不能访问备忘录的内容。负责人对象主要是在合适的时机存储和提供备忘录对象给原发器。例如,在文本编辑器中,撤销 / 重做功能模块可以作为负责人,它保存文档对象每次更改后的备忘录,当用户需要撤销操作时,它就把相应的备忘录提供给文档对象,让文档对象恢复状态。
工作原理
当原发器需要保存状态时,它创建一个备忘录对象,将自身的当前状态信息复制到备忘录对象中。然后,原发器将备忘录对象交给负责人进行保存。当需要恢复状态时,原发器向负责人请求获取之前保存的备忘录对象,然后使用备忘录对象中的状态信息来恢复自身的状态。
代码示例
以下是一个简单的 C++ 备忘录模式示例,模拟一个简单游戏角色的状态保存和恢复。
备忘录类(Memento)
class Memento {
private:
int health;
int mana;
public:
Memento(int h, int m) : health(h), mana(m) {}
int getHealth() const {
return health;
}
int getMana() const {
return mana;
}
};
原发器类 - 游戏角色(GameCharacter)
class GameCharacter {
private:
int health;
int mana;
public:
GameCharacter() : health(100), mana(50) {}
Memento createMemento() {
return Memento(health, mana);
}
void restoreMemento(const Memento& memento) {
health = memento.getHealth();
mana = memento.getMana();
}
void takeDamage(int damage) {
health -= damage;
}
void useMana(int cost) {
mana -= cost;
}
void displayStatus() {
std::cout << "生命值: " << health << ", 魔法值: " << mana << std::endl;
}
};
- 负责人类 - 游戏存档(GameSave)
class GameSave {
private:
Memento memento;
public:
void saveMemento(const Memento& m) {
memento = m;
}
Memento getMemento() const {
return memento;
}
};
- 使用示例
int main() {
GameCharacter character;
character.displayStatus();
GameSave save;
save.saveMemento(character.createMemento());
character.takeDamage(30);
character.useMana(20);
character.displayStatus();
character.restoreMemento(save.getMemento());
character.displayStatus();
return 0;
}
优点
- 保持封装性:
备忘录模式通过将状态的保存和恢复封装在原发器和备忘录对象中,使得其他对象无法直接访问和修改状态信息,保证了对象状态的安全性和封装性。例如,在一个复杂的软件系统中,核心业务对象的状态可以通过备忘录模式进行保存和恢复,而不会被其他无关模块随意修改。 - 便于状态恢复和撤销操作:
可以方便地实现对象状态的恢复功能,如撤销操作。在文本编辑器、图形编辑软件等应用中,备忘录模式可以很好地支持撤销 / 重做功能,用户可以轻松地将对象恢复到之前的某个状态。 - 支持多状态保存:
可以通过负责人对象保存多个不同时刻的备忘录,从而支持对象恢复到多个不同的历史状态。例如,在游戏开发中,可以保存游戏角色在多个关卡开始时的状态,玩家可以选择恢复到任意一个关卡开始时的状态。
缺点
- 资源消耗:
如果需要频繁地保存对象的状态,可能会消耗大量的内存等资源,尤其是当对象的状态数据量较大时。例如,在一个视频编辑软件中,如果频繁保存视频的每一帧状态,会占用大量的存储空间。 - 复杂的状态管理:
对于复杂的对象状态,备忘录的创建、保存和恢复操作可能会变得复杂。例如,当对象的状态包含多个相互关联的子状态,或者状态的保存和恢复需要考虑一些特殊的业务逻辑时,备忘录模式的实现会变得困难。
1041

被折叠的 条评论
为什么被折叠?



