备忘录模式(Memento)
以保存游戏进度为例
Memento类定义了内部的状态,而Caretake类是一个保存进度的管理者,GameRole类是游戏角色类。可以看到GameRole的对象依赖于Memento对象,而与Caretake对象无关。
#include <iostream>
using namespace std;
#include <vector>
class Memento {
public:
Memento(int vitality, int attack, int defense):
m_vitality(vitality), m_attack(attack), m_defense(defense){} //初始化列表
//Memento& operator=(const Memento& memento) { //赋值操作
// m_vitality = memento.m_vitality;
// m_attack = memento.m_attack;
// m_defence = memento.m_defence;
// return *this;
//}
public:
int m_vitality;
int m_attack;
int m_defense;
};
//游戏角色
class GameRole {
public:
GameRole():m_vitality(100), m_attack(100), m_defense(100) {} //初始化游戏角色属性
void ShowState() {
cout << "生命力: " << m_vitality << "\t攻击力: " << m_attack
<< "\t防御力: " << m_defense << endl;
}
//创建备忘录 ——将游戏角色的状态 通过实例化 Memento 返回
Memento SaveState() {
return Memento(m_vitality, m_attack, m_defense);
}
//恢复角色状态——可将外部的“角色状态存储箱”中的状态值恢复给游戏角色
void RecoveryState(Memento memento) {
m_vitality = memento.m_vitality;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
}
void Attack() {
m_vitality -= 10;
m_attack -= 10;
m_defense -= 10;
}
private:
int m_vitality;
int m_attack;
int m_defense;
};
class Caretaker {
public:
Caretaker(){}
void SaveMemento(Memento memento) { m_vecMemento.push_back(memento); }
Memento LoadMemento(int state) { return m_vecMemento[state]; }
private:
vector<Memento> m_vecMemento;
};
int main() {
Caretaker caretaker;
GameRole role;
role.ShowState();
caretaker.SaveMemento(role.SaveState());
role.Attack();
role.ShowState();
caretaker.SaveMemento(role.SaveState());
role.RecoveryState(caretaker.LoadMemento(0));
role.ShowState();
return 0;
}