设计模式系列--备忘录模式
来源:互联网 发布:网络运维工程师笔试题 编辑:程序博客网 时间:2024/05/16 23:44
Originator:负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。
Memento:负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
Caretaker:负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。
Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复.原理很简单,实现的时候需要注意一个地方:窄接口和宽接口.所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,把接口作为private成员,而把需要访问这些接口函数的类作为这个类的友元类,也就是说接口只暴露给了对这些接口感兴趣的类,而不是暴露在外部.下面的实现就是窄实现的方法来实现的.
Memento模式比较适用于功能比较复杂的,但需要维护或记录历史属性的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。
如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。
#include <iostream>#include <string>#include <vector>using namespace std;//备忘录的节点,class Memento{public:string state;Memento(string state) //记录当前的状态,{this->state = state;}};class Originator//类的包含备忘录的节点{public:string state;void setMemento(Memento *Memento){state = Memento->state;}Memento *createMemento(){return new Memento(state);}void show(){cout << state << endl;}};//备忘录的集合class Caretaker{public:vector<Memento *> mens;void save(Memento *men){(this->mens).push_back(men);}Memento *getState(int i){return mens[i];}};int main(){Originator *og = new Originator();Caretaker *ct = new Caretaker();og->state = "on";og->show();ct->save(og->createMemento());og->state = "off";og->show();ct->save(og->createMemento());og->state = "middle";og->show();ct->save(og->createMemento());og->setMemento(ct->getState(1));og->show();og->setMemento(ct->getState(2));og->show();cin.get();return 0;}
0 0
- 设计模式系列--备忘录模式
- 设计模式系列:备忘录模式
- JAVA系列-设计模式-备忘录模式
- Android设计模式系列(5)--备忘录模式
- 设计模式-----备忘录模式
- 设计模式 备忘录模式
- 【设计模式】备忘录模式
- 设计模式 - 备忘录模式
- 设计模式:备忘录模式
- 设计模式 - 备忘录模式
- 设计模式 - 备忘录模式
- 设计模式 - 备忘录模式
- 设计模式:备忘录模式
- 【设计模式】备忘录模式
- 设计模式-备忘录模式
- 设计模式--备忘录模式
- 设计模式--备忘录模式
- 设计模式--备忘录模式
- leetcode:twosum
- 快速排序
- Objective-C之Mark
- Android:Layout_weight的深刻理解
- UVA 1149 Bin packing
- 设计模式系列--备忘录模式
- 1094. The Largest Generation (25)
- mongodb创建用户操作
- android 屏幕适配
- leetcode : Balanced Binary Tree
- ViewPager(页面滑动,加动态点,循环,加标题)
- JNI传递参数
- 把一个项目作为library加入其它项目出现莫名错误
- [概念]Base64编码