C++设计模式[十七]备忘录模式
2015-11-26 13:48
423 查看
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。说白了就是保存功能,像我们玩游戏时的及时保存操作。
一个备忘录是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器。当需要设置原发器的检查点时,取消操作机制会向原发器请求一个备忘录。原发器用描述当前状态的信息初始化该备忘录。只有原发器可以向备忘录中存取信息,备忘录对其他的对象是“不可见”的。
Memento:备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者只能看到备忘录的窄接口————它只能将备忘录传递给其他对象。相反,原发器能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个原发器访问本备忘录的内部状态;
Originator:原发器创建一个备忘录,用以记录当前时刻它的内部状态;我们使用备忘录恢复内部状态;
Caretaker:负责保存好备忘录;但是,不能对备忘录的内容进行操作或检查。
一个简单例子:
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。说白了就是保存功能,像我们玩游戏时的及时保存操作。
一个备忘录是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器。当需要设置原发器的检查点时,取消操作机制会向原发器请求一个备忘录。原发器用描述当前状态的信息初始化该备忘录。只有原发器可以向备忘录中存取信息,备忘录对其他的对象是“不可见”的。
Memento:备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者只能看到备忘录的窄接口————它只能将备忘录传递给其他对象。相反,原发器能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个原发器访问本备忘录的内部状态;
Originator:原发器创建一个备忘录,用以记录当前时刻它的内部状态;我们使用备忘录恢复内部状态;
Caretaker:负责保存好备忘录;但是,不能对备忘录的内容进行操作或检查。
一个简单例子:
#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; }
相关文章推荐
- C++中模板类声明和实现能否分离?
- C++自学历程——启程篇
- 怎样才能学精c语言?
- 喝汽水问题
- C++ - 泛型编程:template模板
- c语言:使用for循环编写一个判断闰年的程序
- C++ const变量使用技巧总结
- AES-256-CBC-PKCS5Padding用c语言实现,并支持Android手机的调用
- C语言_变量的使用
- C语言中简单的循环
- C++11中值得关注的几大变化
- 《读书笔记》系列3:C++编程思想
- c++共享锁的使用
- c语言之大数阶乘
- c++11只调用一次的函数
- c++读取配置文件2
- C/C++中二进制与文本方式打开文件的区别
- C++ copy constructor
- codeforces602C The Two Routes (最短路模板题)
- 把vim打造成C++ IDE