1、介绍
备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后将对象恢复到原先保存的状态。
该模式主要涉及三个角色:
(1)发起人(Originator):这是需要保存和恢复状态的对象。发起人通常包含需要保存的状态数据,以及创建备忘录和从备忘录中恢复状态的方法。
(2)备忘录(Memento):用于存储发起人对象状态的对象。备忘录通常具有访问状态数据的方法,但不能直接修改状态。
(3)管理者(Caretaker):负责管理备忘录的对象。它可以保存多个备忘录对象,并提供对备忘录的访问,通常提供了保存和恢复状态的接口。
2、示例
#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;
}
结果:
角色当前状态:
体力:100 攻击力:100 防御力:100
角色当前状态:
体力:0 攻击力:0 防御力:0
角色当前状态:
体力:100 攻击力:100 防御力:100