C++ 18备忘录模式
2015-12-14 10:30
489 查看
备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
备忘录模式结构图:
![](http://img.blog.csdn.net/20151214102349637)
Originator类,负责闯将一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录回复内部状态。
MeMento类,负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。
Caretaker类,负责保存好备忘录Memento。
案例:游戏进度备忘录
![](http://img.blog.csdn.net/20151214102357571)
详细代码:
备忘录模式结构图:
Originator类,负责闯将一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录回复内部状态。
MeMento类,负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。
Caretaker类,负责保存好备忘录Memento。
案例:游戏进度备忘录
详细代码:
/* *备忘录模式 */ #include<iostream> #include<string> #include<vector> using namespace std; class RoleStateMemento; //RoleStateOriginator class GameRoleOriginator { private: int vit = 100;//生命力,默认角色状态都为100 int atk = 100;//攻击力 int def = 100;//防御力 public: void GetState()//获得游戏角色的状态 { cout << "游戏角色的当前状态:" << endl; cout << "生命力:" << vit << endl; cout << "攻击力:" << atk << endl; cout << "防御力:" << def << endl; } void Fight()//每战斗一次,各个值减少20 { if (vit >= 20) { vit -= 20; atk -= 20; def -= 20; } else cout << "状态消耗殆尽,GameOver!" << endl; } RoleStateMemento* SaveState();//保存当前状态 void RecoveryState(RoleStateMemento *memo);//恢复当前状态 }; //RoleStateMemento类 class RoleStateMemento { public: int vit;//生命力 int atk;//攻击力 int def;//防御力 RoleStateMemento(int vit, int atk, int def) : vit(vit), atk(atk), def(def) {} }; //RoleStateCaretaker类 class RoleStateCaretaker { public: vector < RoleStateMemento* > memento; void Save(RoleStateMemento* mem)//保存角色状态 { memento.push_back(mem); } RoleStateMemento* GetRoleState(int i)//获得角色状态 { return memento[i]; } }; RoleStateMemento* GameRoleOriginator::SaveState()//保存当前状态 { return(new RoleStateMemento(vit, atk, def)); } void GameRoleOriginator::RecoveryState(RoleStateMemento *memo)//恢复当前状态 { vit = memo->vit; atk = memo->atk; def = memo->def; } int main() { //大战boss前 GameRoleOriginator *lixiaoyao = new GameRoleOriginator(); lixiaoyao->GetState(); lixiaoyao->Fight(); lixiaoyao->GetState(); RoleStateCaretaker rs; rs.Save(lixiaoyao->SaveState());//保存当前状态 各为80 lixiaoyao->Fight(); rs.Save(lixiaoyao->SaveState());//保存当前状态 各为60 lixiaoyao->Fight(); lixiaoyao->Fight(); lixiaoyao->Fight();//经过5轮厮杀,三项指标全为0 lixiaoyao->GetState(); //恢复第一次保存的状态 RoleStateMemento *roleState=rs.GetRoleState(0); lixiaoyao->RecoveryState(roleState); lixiaoyao->GetState(); return 0; }运行结构如下:
相关文章推荐