定义
备忘录模式(Memento Pattern)是一种行为型设计模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
结构
-
备忘录(Memento) :
- 负责存储发起人的内部状态。在不破坏封装性的前提下,备忘录对象会存储发起人的内部状态。备忘录只允许发起人访问其状态。
- 备忘录通常包含保存状态所需的私有成员变量,并提供访问这些变量的友元函数或者其他受限访问的机制。
-
发起人(Originator) :
- 创建一个包含其当前内部状态的备忘录对象,并能根据备忘录对象恢复其内部状态。
- 发起人可以访问其内部状态,并提供创建备忘录和恢复状态的方法。
- 发起人将自身的内部状态保存到备忘录对象中,并能够从备忘录对象中恢复之前的状态。
-
管理者(Caretaker) :
- 负责保存好备忘录,但不能对备忘录的内容进行操作或检查。
- 管理者持有对备忘录对象的引用,但不对备忘录对象的内容进行操作,只负责备忘录的存储和管理。
代码示例
通过角色状态管理者保存和恢复游戏角色的状态。
#include <iostream>
// 角色状态存储类
class RoleStateMemento
{
private:
int vitality;
int attack;
int defense;
public:
RoleStateMemento()
{
}
RoleStateMemento(int vitality, int attack, int defense)
: vitality(vitality), attack(attack), defense(defense) {}
int getVitality() const
{
return vitality;
}
void setVitality(int val)
{
vitality = val;
}
int getAttack() const
{
return attack;
}
void setAttack(int val)
{
attack = val;
}
int getDefense() const
{
return defense;
}
void setDefense(int val)
{
defense = val;
}
};
// 游戏角色
class GameRole
{
private:
int vitality; // 生命力
int attack; // 攻击力
int defense; // 防御力
public:
int getVitality() const
{
return vitality;
}
void setVitality(int val)
{
vitality = val;
}
int getAttack() const
{
return attack;
}
void setAttack(int val)
{
attack = val;
}
int getDefense() const
{
return defense;
}
void setDefense(int val)
{
defense = val;
}
// 状态显示
void displayState()
{
std::cout << "角色当前状态:" << std::endl;
std::cout << "体力:" << vitality << std::endl;
std::cout << "攻击力:" << attack << std::endl;
std::cout << "防御力:" << defense << std::endl;
std::cout << std::endl;
}
// 获得初始状态
void getInitState()
{
vitality = 100;
attack = 100;
defense = 100;
}
// 战斗(战斗后死亡)
void fight()
{
vitality = 0;
attack = 0;
defense = 0;
}
// 保存角色状态
RoleStateMemento saveState()
{
return RoleStateMemento(vitality, attack, defense);
}
// 恢复角色状态
void recoveryState(RoleStateMemento memento)
{
setVitality(memento.getVitality());
setAttack(memento.getAttack());
setDefense(memento.getDefense());
}
};
// 角色状态管理者
class RoleStateCaretaker
{
private:
RoleStateMemento memento;
public:
RoleStateMemento getRoleStateMemento() const
{
return memento;
}
void setRoleStateMemento(RoleStateMemento val)
{
memento = val;
}
};
int main()
{
GameRole role;
role.getInitState();
role.displayState();
// 保存进度
std::unique_ptr<RoleStateCaretaker> stateAdmin = std::make_unique<RoleStateCaretaker>();
stateAdmin->setRoleStateMemento(role.saveState());
// 战斗
role.fight();
role.displayState();
// 游戏进度恢复
role.recoveryState(stateAdmin->getRoleStateMemento());
// 显示状态
role.displayState();
system("pause");
return 0;
}