备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在外部保存为以后恢复之前状态,存储信息。
缺点如果数据较多,需要储存的节点也多的话,将会消耗大量内存。不过这也不是什么特别大的问题,如今个人计算机配置很少有低于8G或者16G内存的,而消耗大于8G或16G以上内存的程序相对来说还是比较少的。服务器就更可以随意配置了。
#include <stdio.h> #include<vector> using std::vector; //数据块 class StateMemento { public: StateMemento(int v, int a, int d) :vit(v), atk(a), def(d) { } public: int vit; int atk; int def; }; //游戏角色 class GameRole { public: GameRole(int a, int b, int c) :vit(a), atk(b), def(c) { } StateMemento *savestate() { return (new StateMemento(vit, atk, def)); } void recoverystate(StateMemento* state) { this->vit = state->vit; this->atk = state->atk; this->def = state->def; } void displaystate() { printf("生命力%d\n",vit); printf("攻击力%d\n",atk); printf("防御力%d\n",def); } void fight() { vit -= 10; atk -= 10; def -= 10; } private: int vit; int atk; int def; }; //角色管理 class RoleManager { public: void memsave(StateMemento* state) { m_vector.push_back(state); } StateMemento* memget() { return m_vector[m_vector.size()-1]; } ~RoleManager() { do { delete m_vector[m_vector.size()-1]; m_vector.pop_back(); } while (!m_vector.empty()); } private: vector<StateMemento*> m_vector; }; int main() { GameRole *lxy = new GameRole(100,90,110); lxy->displaystate(); RoleManager *manger = new RoleManager; manger->memsave(lxy->savestate()); lxy->fight(); lxy->displaystate(); printf("--------恢复各项指标-----------\n" ); lxy->recoverystate(manger->memget()); lxy->displaystate(); return 0; }
设计模式写到这里估计大家也发现了,很多设计模式长得特别像,其实还是刚开始说的那样,一个编程高手到了一定地步后都会遗忘或淡忘掉这些所谓的设计模式的,或者说这些设计模式已经到了根据实际需要信手拈来,而忘记其名称的境界。