设计模式系列--备忘录模式

来源:互联网 发布:网络运维工程师笔试题 编辑:程序博客网 时间: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