先说一下该模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
然后举一个几乎所有人都深有体会的例子:游戏进度保存。比如我最近玩的生存游戏*****,里面人物有:生命值,饥饿值,体力值。背包里还有各种物品。为了避免人物死掉丢失数据,我们会时不时的保存一下。这里面保存的就是当时的人物数据,可以用到备忘录模式。
接着介绍一下备忘录模式在游戏保存这个例子中都有哪几个类:人物类(就是游戏里的人物,该类拥有游戏中的人物中的所有属性和物品),保存内容类(该类中封装了需要保存的人物类中的内容),保存类(该类将打包的内容类保存起来,备用)
最后上代码:
#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
class BackUp //备份类
{
public:
BackUp(int bloodVolume, int bodyStrength, int hungerValue, map<string, int> backpack)
{
m_bloodVolume = bloodVolume;
m_bodyStrength = bodyStrength;
m_hungerValue = hungerValue;
m_backpack = backpack;
}
~BackUp()
{
}
private:
int m_bloodVolume; //生命值
int m_bodyStrength; //体力值
int m_hungerValue; //饥饿值
map<string, int> m_backpack; //背包
};
class Survivor //游戏中的主角人物
{
public:
Survivor()
{
m_bloodVolume = 100;
m_bodyStrength = 100;
m_hungerValue = 100;
}
~Survivor()
{
}
BackUp* backUp() //备份功能函数
{
m_backUp = new BackUp(m_bloodVolume, m_bodyStrength, m_hungerValue, m_backpack);
return m_backUp;
}
/*******************增加功能*****************************************/
void addBloodVolume(int number) //医疗包等治疗物品
{
m_bloodVolume += number;
if (m_bloodVolume > 200)
{
m_bloodVolume = 200;
}
}
void addBodyStrength(int number) //随着时间恢复
{
m_bodyStrength += number;
if (m_bodyStrength > 200)
{
m_bodyStrength = 200;
}
}
void addHungerValue(int number) //食物等
{
m_hungerValue += number;
if (m_hungerValue > 200)
{
m_hungerValue = 200;
}
}
void addMaterial(string name, int num)
{
map<string, int> backpack= m_backpack;
backpack[name] += num;
if (backpack[name] > 20)
{
backpack[name] = 20;
}
if (backpack.size() <= 20)
{
m_backpack = backpack;
}
}
/*******************减少功能,略*****************************************/
private:
BackUp *m_backUp; //备份类
int m_bloodVolume; //生命值
int m_bodyStrength; //体力值
int m_hungerValue; //饥饿值
map<string, int> m_backpack; //背包
};
class Save //存档读档类
{
public:
void save(BackUp *backUp)
{
m_gameRecording.push_back(backUp);
}
BackUp* read(int index)
{
if (m_gameRecording.size() > index)
return m_gameRecording[index];
}
~Save()
{
//析构指针。
}
private:
vector<BackUp*> m_gameRecording;
};
void main()
{
Survivor leaderRole;
Save archiveOffice;
leaderRole.addBloodVolume(1000);
leaderRole.addBodyStrength(2);
leaderRole.addHungerValue(30);
leaderRole.addMaterial("草药", 15);
leaderRole.addMaterial("草药", 6);
archiveOffice.save(leaderRole.backUp());
system("pause");
return;
}
如代码所示,三个类:人物类(Survivor),保存内容类(BackUp),保存类(Save)。其中,BackUp可以视为一个中转类或者包裹类。Survivor类可以打包自身数据,并以BackUp类的形式返回。Save类可以接受BackUp类型的“包裹”,并将其储存起来。