备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
Memento模式比较适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性的一小部分。
//mementorole.h
#pragma once #include <iostream> using namespace std; class MementoRole{ private: int vit;//生命值 int def;//防御 int atk;//攻击 public: MementoRole(int vit,int def,int atk){ this->vit = vit; this->def = def; this->atk = atk; } int getVit(){return vit;} int getDef(){return def;} int getAtk(){return atk;} ~MementoRole(){ cout << "~MementoRole()" << endl; } };
//OrignatorRole.h
#pragma once #include "mementorole.h" #include <iostream> using namespace std; class OrignatorRole{ private: MementoRole *mr; public: OrignatorRole(){ mr = NULL; } void setMemento(MementoRole *mr){ this->mr = mr; } MementoRole *getMemento(){ return mr; } ~OrignatorRole(){ cout << "~OrignatorRole()" << endl; if(mr != NULL){ delete mr; cout << "delete mr" << endl; } } };
//role.h
#pragma once #include <iostream> #include "mementorole.h" using namespace std; class Role{ private: int vit;//生命值 int def;//防御 int atk;//攻击 public: MementoRole* createMemento(){ return new MementoRole(vit,def,atk); } void setMemento(MementoRole *mr){ this->vit = mr->getVit(); this->def = mr->getDef(); this->atk = mr->getAtk(); } void setVit(int v){this->vit = v; } void setDef(int d){this->def = d; } void setAtk(int a){this->atk = a; } void show(){ cout << "vit = " << vit << endl; cout << "def= " << def << endl; cout << "atk = " << atk << endl; } ~Role(){ cout << "~Role()" << endl; } };
//main.cpp
#include <iostream> #include <cstdlib> #include "role.h" #include "OrignatorRole.h" using namespace std; int main(){ cout << "开始:" << endl; Role *r = new Role(); r->setVit(100); r->setDef(100); r->setAtk(100); r->show(); OrignatorRole *or = new OrignatorRole(); or->setMemento(r->createMemento()); cout << "中间:" << endl; r->setVit(10); r->setDef(10); r->setAtk(10); r->show(); cout << "恢复开始:" << endl; r->setMemento(or->getMemento()); r->show(); delete r; delete or; return 0; };