我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
来源:互联网 发布:半钢子午胎数据 编辑:程序博客网 时间:2024/05/21 20:29
概述:
我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。
这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。
类图和实例:
简单的模式实例:
#include <iostream>#include <string>using namespace std;class Memento {private: string state;public: Memento() { state = ""; } Memento(string state){ this->state = state; } string getState() { return state; } void setState(string state) { this->state = state; }};class Originator {private : string state;public: Originator() { state = ""; } string getState() { return state; } void setState(string state) { this->state = state; } Memento createMemento(){ return Memento(this->state); } void restoreMemento(Memento memento){ this->setState(memento.getState()); }};class Caretaker {private : Memento memento;public : Memento getMemento(){ return memento; } void setMemento(Memento memento){ this->memento = memento; }};int main (int argc, char *argv[]) { Originator originator; originator.setState("状态1"); cout<<"初始状态:"<<originator.getState()<<endl; Caretaker caretaker; caretaker.setMemento(originator.createMemento()); originator.setState("状态2"); cout<<"改变后状态:"<<originator.getState()<<endl; originator.restoreMemento(caretaker.getMemento()); cout<<"恢复后状态:"<<originator.getState()<<endl;}
适用性:
适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。
优缺点:
优点:
1)当发起人角色的状态有改变时,有可能是个错误的改变,我们使用备忘录模式就可以把这个错误改变还原。
2)备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。
缺点:
1)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。
LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9745019】
其他设计模式文章请参考:我所理解的设计模式
- 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
- 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
- 设计模式——备忘录(Memento Pattern)模式
- Java设计模式——备忘录模式(Memento Pattern)
- (C++实现)——备忘录模式(Memento Pattern)
- 我所理解的设计模式(C++实现)——桥模式(Bridge Pattern)
- 我所理解的设计模式(C++实现)——原型模式(Prototype Pattern)
- 我所理解的设计模式(C++实现)——适配器模式(Adapter Pattern)
- 我所理解的设计模式(C++实现)——组合模式(Composite Pattern)
- 我所理解的设计模式(C++实现)——外观模式(Facade Pattern)
- 我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
- 我所理解的设计模式(C++实现)——命令模式(Command Pattern)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern)
- 我所理解的设计模式(C++实现)——迭代器模式(Iterator Pattern)
- sizeof
- WinServer 2008 发布Office文件不能访问问题
- C/C++语言void及void指针深层探索
- 部分和问题---多重部分和问题---动态规划
- Centos 安装nginx
- 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
- request 获取浏览器所带参数
- 3n+1
- 影响百度竞价点击量的7大原因
- 访问 IIS 元数据库失败
- HDU 4392 反素数java
- TURBOMOLE 6.5 for Linux x86_64 demo版的破解
- 《Windows编程零基础》__2 一个完整的程序
- GRAILS2入门 - 参考文档