设计模式学习(十七)————备忘录模式
2016-09-27 08:17
465 查看
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
就拿游戏的角色数据来举个例子:
这样就可以随时进行游戏数据的存储和取得啦,主程序可以模拟这一个过程:
由这个例子可以看到,
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/gameSave_Memento_Pattern_18
就拿游戏的角色数据来举个例子:
#ifndef GAMEROLE #define GAMEROLE #include <QtDebug> //角色状态存储箱 class RoleStateMemento { public: RoleStateMemento(int vit,int atk,int def):_vit(vit),_atk(atk),_def(def){} int getVitality(){return _vit;} void setVitality(int vit){_vit=vit;} int getAttack(){return _atk;} void setAttack(int atk){_atk=atk;} int getDefense(){return _def;} void setDefense(int def){_def=def;} private: int _vit; int _atk; int _def; }; //游戏角色 class GameRole { public: int getVitality(){return _vit;} void setVitality(int vit){_vit=vit;} int getAttack(){return _atk;} void setAttack(int atk){_atk=atk;} int getDefense(){return _def;} void setDefense(int def){_def=def;} QSharedPointer<RoleStateMemento> SaveState(){return QSharedPointer<RoleStateMemento>(new RoleStateMemento(_vit,_atk,_def));} void RecoveryState(RoleStateMemento me){_vit=me.getVitality();_atk=me.getAttack();_def=me.getDefense();} void stateDisplay() { qDebug()<<"角色当前状态:"; qDebug()<<"体力:"<<_vit; qDebug()<<"攻击力:"<<_atk; qDebug()<<"防御力:"<<_def; } private: int _vit; int _atk; int _def; }; //角色状态管理者 class RoleStateCaretaker { public: RoleStateCaretaker(int vit=0,int atk=0,int def=0):_meto(RoleStateMemento(vit,atk,def)){} void setRoleStateMemento(RoleStateMemento meto){_meto=meto;} RoleStateMemento getRoleStateMemento(){return _meto;} private: RoleStateMemento _meto; }; #endif // GAMEROLE
这样就可以随时进行游戏数据的存储和取得啦,主程序可以模拟这一个过程:
#include "gamerole.h" #include <QtDebug> int main(int argc, char *argv[]) { //大战前 GameRole *gr = new GameRole(); gr->setAttack(100);gr->setDefense(100);gr->setVitality(100); qDebug()<<"初始"; gr->stateDisplay(); //保存进度 RoleStateCaretaker *roleAdm = new RoleStateCaretaker(); roleAdm->setRoleStateMemento(*gr->SaveState()); //大战boss,损失严重 gr->setAttack(50);gr->setDefense(50);gr->setVitality(50); qDebug()<<"大战后"; gr->stateDisplay(); //恢复之前状态 gr->RecoveryState(roleAdm->getRoleStateMemento()); qDebug()<<"读取存档后"; gr->stateDisplay(); return 0; }
由这个例子可以看到,
RoleStateCaretaker类管理着一个
RoleStateCaretaker类的实例,可以随时保存和恢复这个实例里面的数据。这样就做到了备忘录模式的核心内容————保存和恢复!
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/gameSave_Memento_Pattern_18
相关文章推荐
- 设计模式学习笔记(十七)—Memento备忘录模式
- 设计模式学习笔记十七——Iterator模式
- 设计模式学习笔记(十七)——Command命令模式
- 步步为营 .NET 设计模式学习笔记 十七、Flyweight(享元模式)
- HeadFir st 设计模式学习笔记22-- 备忘录(M emento)模式拾零
- 设计模式学习笔记(十七)——Command命令模式
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
- 设计模式学习笔记——备忘录模式
- “设计模式”学习之八:备忘录、观察者与状态(行为型)
- 设计模式学习-每日一记(19.备忘录模式)
- 设计模式学习笔记——备忘录模式
- 设计模式学习-Memento(备忘录)
- 设计模式学习笔记十七:组合模式(Composite Pattern)
- 设计模式学习笔记(十七)——Interpreter解释器
- 设计模式学习笔记--Memento 备忘录模式
- 步步为营 .NET 设计模式学习笔记 十七、Flyweight(享元模式)
- java 设计模式 学习笔记 (14) 备忘录模式
- 【HeadFirst 设计模式学习笔记】21 备忘录(Memento)模式拾零
- 设计模式学习-----备忘录模式