备忘录模式
原创
©著作权归作者所有:来自51CTO博客作者顾道长生的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、问题描述
请对游戏人物的存档过程进行模拟:
游戏人物的状态包括:体力、攻击、防御
游戏过程发生的情境:遇到BOSS前存档(保存游戏人物状态);遇到BOSS后游戏人物失败(状态清零);需重新加载存档文件(读取状态还原给游戏人物)。
二、完成如下题目要求
画出静态图

(2)写出采用该设计模式的好处
1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,
使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需
要的这些状态的版本。
3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
编写代码
#include<bits/stdc++.h>
using namespace std;
//角色状态存储箱
class RoleStateMemento
{
public:
int m_life; //生命值
int m_attack; //进攻值
int m_defense; //防守值
public:
RoleStateMemento(int life, int attack, int defense):
m_life(life),m_attack(attack),m_defense(defense){}
RoleStateMemento& operator=(const RoleStateMemento &memento)
{
m_life = memento.m_life;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
return *this;
}
};
//游戏角色
class GameRole
{
private:
int m_life;
int m_attack;
int m_defense;
public:
GameRole(): m_life(100),m_attack(100),m_defense(100) {}
RoleStateMemento Save() //保存进度,只与RoleStateMemento对象交互,并不牵涉到RoleStateCaretaker
{
RoleStateMemento memento(m_life, m_attack, m_defense);
return memento;
}
void Load(RoleStateMemento memento) //载入进度
{
m_life = memento.m_life;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
}
void Show() { cout<<"体力 : "<< m_life<<"\n攻击 : "<< m_attack<<"\n防御 : "<< m_defense<<endl; }
void Attack() { m_life -= 10; m_attack -= 10; m_defense -= 10; }
};
//角色状态管理者
class RoleStateCaretaker
{
public:
RoleStateCaretaker() {}
void Save(RoleStateMemento menento) { m_vecMemento.push_back(menento); }
RoleStateMemento Load(int state) { return m_vecMemento[state]; }
private:
vector<RoleStateMemento> m_vecMemento;
};
//测试
int main()
{
RoleStateCaretaker caretake;
GameRole role;
role.Show(); //初始值
cout<<endl;
caretake.Save(role.Save()); //保存状态
role.Attack();
role.Show(); //进攻后
cout<<endl;
role.Load(caretake.Load(0)); //载入状态
role.Show(); //恢复到状态0
return 0;
}