一 概念
二 UML图
三 备忘录适用的场合
四 C++代码实现
#include "pch.h"
#include <iostream>
using namespace std;
class RoleStateMemento
{
public:
RoleStateMemento(int vit, int atk, int def)
:m_vit(vit), m_atk(atk), m_def(def) {}
void SetVitality(int v)
{
this->m_vit = v;
}
int GetVitality() const
{
return this->m_vit;
}
void SetAttack(int atk)
{
this->m_atk = atk;
}
int GetAttack() const
{
return this->m_atk;
}
void SetDefense(int def)
{
this->m_def;
}
int GetDefense()
{
return this->m_def;
}
private:
int m_vit;
int m_atk;
int m_def;
};
class GameRole
{
public:
GameRole()
{
}
void SetVitality(int v)
{
this->m_vit = v;
}
int GetVitality() const
{
return this->m_vit;
}
void SetAttack(int atk)
{
this->m_atk = atk;
}
int GetAttack() const
{
return this->m_atk;
}
void SetDefense(int def)
{
this->m_def;
}
int GetDefense()
{
return this->m_def;
}
void StateDisplay() const
{
cout << "角色当前状态:" << endl;
cout << "体力: " << this->m_vit << endl;
cout << "攻击力: " << this->m_def << endl;
cout << "防御力: " << this->m_atk << endl;
}
//获得初始状态 数据通常来自本机磁盘或远程数据库
void GetInitState()
{
this->m_atk = 100;
this->m_def = 100;
this->m_vit = 100;
}
//在与Boss大战后游戏数据损坏为零
void Fight()
{
this->m_atk = 0;
this->m_def = 0;
this->m_vit = 0;
}
//新增保存角色状态方法,将游戏角色的三个状态值通过
//实例化角色状态存储箱返回
RoleStateMemento* SaveState()
{
RoleStateMemento* statememento = new RoleStateMemento(this->m_vit,this->m_atk,this->m_def);
return statememento;
}
//新增恢复角色状态方法,可以将外部的角色状态存储箱中状态值恢复给游戏角色
void RecoveryState(RoleStateMemento* memento)
{
this->m_vit = memento->GetVitality();
this->m_atk = memento->GetAttack();
this->m_def = memento->GetDefense();
}
private:
int m_vit;
int m_atk;
int m_def;
};
//角色状态管理者类
class RoleStateCaretaker
{
public:
void SetRoleStateMemento(RoleStateMemento* m_memento)
{
this->m_memento = m_memento;
}
RoleStateMemento* GetMemento()
{
return this->m_memento;
}
private:
RoleStateMemento* m_memento;
};
int main()
{
GameRole* lixiaoyao = new GameRole();
lixiaoyao->GetInitState(); //大战Boss之前 获得角色初始状态
lixiaoyao->StateDisplay();
//保存进度 由于封装在Memento中,因此我们并不知道保存了
//那些具体角色的数据
RoleStateCaretaker* stateAdmin = new RoleStateCaretaker();
stateAdmin->SetRoleStateMemento(lixiaoyao->SaveState());
cout << "大战BOSS后的状态" << endl;
//大战BOSS时,损坏严重
lixiaoyao->Fight();
lixiaoyao->StateDisplay();
cout << "恢复之前的状态" << endl;
//恢复之前的状态
lixiaoyao->RecoveryState(stateAdmin->GetMemento());
lixiaoyao->StateDisplay();
return 0;
}
原文:https://www.cnblogs.com/Manual-Linux/p/11155724.html