C++设计模式之备忘录模式(Memento)
当我们在实际应用中需要提供撤销机制,当一个对象可能需要再后续操作中恢复其内部状态时,就需要使用备忘录模式。其本质就是对象的序列化和反序列化的过程,支持回滚操作。
作用
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先的状态。
类视图
实现
typedef struct sysstate; //假设的一个空结构,用来代表系统状态 //还原点 class Memento { public: Memento(sysstate &statein) { state = statein; } sysstate& getstate(){ return state} private: sysstate state; }; //运行系统 class system { public: void recovery(Memento* pMem) { if (pMem) { state = pMem->getstate(); } } Memento* backup() { return new Memento(state); } private: sysstate state; }; //还原控制器 class recoveryControl { public: ~recoveryControl() { map<long,Memento*>::iterator iter; for ( iter = m_mementos.begin(); iter != m_mementos.end(); iter++) { delete iter.second; } } long addRecoveryPoint(Memento* pMem) { long t = clock(); m_mementos.instert(pair<long,Memento*>(t, pMem)); return t; } Memento* GetRecoveryPoint(long time) { map<long,Memento*>::iterator iter; iter = m_mementos.find(time); if(iter != m_mementos.end()) return iter->second; return NULL; } void DelRecoveryPoint(long time) { Memento* pMem = GetRecoveryPoint(time); m_mementos.erase(time); delete pMem; } private: map<long,Memento*> m_mementos; }; int main() { system Sys; recoveryControl controler; //备份系统并存入备份管理器中 long time1 = controler.addRecoveryPoint(Sys.backup()); long time2 = controler.addRecoveryPoint(Sys.backup()); //将系统恢复到time1状态 Sys.recovery(controler.GetRecoveryPoint(time1)); //将系统恢复到time2状态 Sys.recovery(controler.GetRecoveryPoint(time2)); }
应用场景
支持回滚操作的 地方,如游戏存档、事务回滚、程序的撤销和恢复操作等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10APUE笔记之:进程环境详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
- 01-10浅谈C/C++中的static与extern关键字的使用详解
- 01-10深入C/C++浮点数在内存中的存储方式详解
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10C#中split用法实例总结
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 01-10delphi制作wav文件的方法
- 08-05dedecms(织梦)副栏目数量限制代码修改