C++设计模式(1):备忘录模式
来源:互联网 发布:日本ip代理地址和端口 编辑:程序博客网 时间:2024/06/10 01:41
这是一系列的文章,在这些文章的开头会首先介绍这个模式,并稍加讨论。然后介绍类图、结构、以及代码。最后对这个模式进行完整的讨论,包括适用性、应用场景、优缺点、与其他模式的关系等等。
在我们设计需要撤回的软件,或者一些游戏的存档时,就需要用到备忘录模式。
备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并在该对象外部保存状态,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
备忘录模式的UML图如下:
该类图中有以下三个方面:
Memento(备忘录):存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录
Originator(原发器):创建一个备忘录,用于记录当前时刻它的内部状态;使用备忘录恢复内部状态
Caretaker(管理者):负责保存好备忘录;不能对备忘录的内容进行操作或检查
代码:
//备忘录class Memento{public: string state; Memento(string state) //记录当前的状态, { this->state = state; }};class Originator{public: string state; void setMemento(Memento *memo) // 通过调用Caretaker中相应的备忘录来恢复状态 { state = memo->state; } Memento *createMemento() //只有原发器才能向备忘录存取信息,备忘录对其他对象是不可见的 { return new Memento(state); } void show() { cout << state << endl; }};//备忘录的管理器class Caretaker{public: vector<Memento *> memo; void save(Memento *memo) { (this->memo).push_back(memo); } Memento *getState(int i) { return memo[i]; }};int main(){ Originator *og = new Originator(); Caretaker *ct = new Caretaker(); og->state = "状态1"; og->show(); ct->save(og->createMemento()); og->state = "状态2"; og->show(); ct->save(og->createMemento()); og->state = "状态3"; og->show(); ct->save(og->createMemento()); og->setMemento(ct->getState(1)); cout << "恢复第2个状态:"; og->show(); og->setMemento(ct->getState(2)); cout << "恢复第3个状态"; og->show(); cin.get(); return 0;}
备忘录模式适用于:
1、必须保存一个对象在某一时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
应用:
设计需要回放的软件,数据库备份,文档的撤销、恢复,游戏中的存档等都会用到此模式。
优点:
备忘录能返回到我们需要的状态,撤回我们的错误。并且备忘录保存在原发器之外,原发器只需要创建好备忘录而不必管理。
缺点:
如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。因此,备忘录模式不能用在for循环中,不能频繁建立。
与其他模式的关系:
在命令模式中,如果命令请求可以撤销的话,那这个功能可以由备忘录模式来实现。
- C++设计模式(1):备忘录模式
- C语言设计模式:备忘录
- C语言和设计模式(备忘录模式)
- C语言和设计模式(备忘录模式)
- C语言和设计模式(备忘录模式)
- 06.C语言和设计模式(备忘录模式)
- 11、C语言和设计模式(备忘录模式)
- 设计模式-----备忘录模式
- 设计模式 备忘录模式
- 【设计模式】备忘录模式
- 设计模式 - 备忘录模式
- 设计模式:备忘录模式
- 设计模式 - 备忘录模式
- 设计模式 - 备忘录模式
- 设计模式 - 备忘录模式
- 设计模式:备忘录模式
- 【设计模式】备忘录模式
- 设计模式-备忘录模式
- AR技术在美妆领域将进一步深入
- 网络请求数据 保存数据库 查询数据库 显示
- BZOJ 1003 物流运输 DP+最短路.
- 有限状态机(FSM)的Java 演示
- 自动行为操控Steering(五)—拦截(单体操控)
- C++设计模式(1):备忘录模式
- centos6.5下使用yum完美搭建LNMP环境(php5.6)
- HTML列表
- grails使用小细节
- python 读excel数值为浮点型问题
- Ui设计中常用的6大工具
- 理解OAuth 2.0-转自阮一峰的网络日志
- MySQL日期查询:本周、本月、本季、本年
- 【链表】非递归过程以O(N)反转单链表