1、介绍
备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后将对象恢复到原先保存的状态。
该模式主要涉及三个角色:
(1)发起人(Originator):这是需要保存和恢复状态的对象。发起人通常包含需要保存的状态数据,以及创建备忘录和从备忘录中恢复状态的方法。
(2)备忘录(Memento):用于存储发起人对象状态的对象。备忘录通常具有访问状态数据的方法,但不能直接修改状态。
(3)管理者(Caretaker):负责管理备忘录的对象。它可以保存多个备忘录对象,并提供对备忘录的访问,通常提供了保存和恢复状态的接口。
2、示例
cpp
#include <iostream>
#include <string>
// 备忘录类,用于存储游戏角色的状态
class RoleStateMemento {
private:
int m_vit; // 生命力
int m_atk; // 攻击力
int m_def; // 防御力
public:
RoleStateMemento(int vit, int atk, int def) : m_vit(vit), m_atk(atk), m_def(def) {}
// 设置生命力
void setVitality(int vit) { m_vit = vit; }
int getVitality() { return m_vit; }
// 设置攻击力
void setAttack(int atk) { m_atk = atk; }
int getAttack() { return m_atk; }
// 设置防御力
void setDefense(int def) { m_def = def; }
int getDefense() { return m_def; }
};
// 发起人,即游戏角色
class GameRole {
private:
int m_vit; // 生命力
int m_atk; // 攻击力
int m_def; // 防御力
public:
// 保存角色状态,返回备忘录对象
RoleStateMemento* saveState() {
return new RoleStateMemento(m_vit, m_atk, m_def);
}
// 恢复角色状态,根据备忘录对象设置角色状态
void recoverState(RoleStateMemento* memento) {
m_vit = memento->getVitality();
m_atk = memento->getAttack();
m_def = memento->getDefense();
}
// 获取初始状态
void getInitState() {
m_atk = m_def = m_vit = 100;
}
void fight() {
m_atk = m_def = m_vit = 0;
}
void stateDisplay() {
std::cout << "角色当前状态:" << std::endl;
std::cout << "体力:" << m_vit << " "
<< "攻击力:" << m_atk << " "
<< "防御力:" << m_def << std::endl;
}
};
// 管理者,用于管理备忘录对象
class RoleStateCaretaker {
private:
RoleStateMemento* m_memento;
public:
~RoleStateCaretaker() {
delete m_memento;
}
void setMemento(RoleStateMemento* memento) {
m_memento = memento;
}
RoleStateMemento* getMemento() {
return m_memento;
}
};
int main() {
// 大战 boss 前
GameRole* lixiaoyao = new GameRole;
lixiaoyao->getInitState();
lixiaoyao->stateDisplay();
// 保存进度
RoleStateCaretaker* stateAdmin = new RoleStateCaretaker;
stateAdmin->setMemento(lixiaoyao->saveState());
// 大战 boss 时,损耗严重
lixiaoyao->fight();
lixiaoyao->stateDisplay();
// 恢复之前状态
lixiaoyao->recoverState(stateAdmin->getMemento());
lixiaoyao->stateDisplay();
delete lixiaoyao;
delete stateAdmin;
return 0;
}
结果:
cpp
角色当前状态:
体力:100 攻击力:100 防御力:100
角色当前状态:
体力:0 攻击力:0 防御力:0
角色当前状态:
体力:100 攻击力:100 防御力:100