设计模式之十四:备忘录模式(Memento)
来源:互联网 发布:小腿肌肉 知乎 编辑:程序博客网 时间:2024/06/08 14:21
备忘录模式:
在不破换封装性的前提下,捕获一个对象的内部状态并将这个状态保存到对象外部,这样这个对象之后可以恢复到保存的状态。
Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later
UML图:
主要包括:
- Memento(Memento):存储Originator的内部状态。并可防止Originator以外的其他对象访问备忘录Memento。
- Originator(SalesProspect):创建一个包含当前状态快照的备忘录Memento,并可以使用Memento来恢复之前保存的状态。
- Caretaker(ProspectMemory):负责保存好备忘录Memento。
这个设计模式很简单,就是面向对象封装这个特性的具体使用。
C++代码:
#include <iostream>#include <string>using namespace std;class Memento{ public: Memento(string s) { state=s; } string getState() { return state; } private: string state;};class Originator{ public: void setMemento(Memento *m) { state=m->getState(); } Memento * createMemento(){ return new Memento(state); } void setState(string s) { state=s; } string getState() { return state; } private: string state;};class Caretaker{ public: Memento* getMemento() { return memento; } void setMemento(Memento *m) { memento=m; } private: Memento * memento;};int main(){ Originator * originator=new Originator(); originator->setState("origin state"); std::cout<<"state 1:"<<originator->getState()<<std::endl; Caretaker * caretaker=new Caretaker(); caretaker->setMemento(originator->createMemento()); originator->setState("change to state"); std::cout<<"state 2:"<<originator->getState()<<std::endl; originator->setMemento(caretaker->getMemento()); std::cout<<"state 3:"<<originator->getState()<<std::endl; return 0;}
执行输出:
下面是一个以具体的例子。
- Originator为SalesProspect,即代理经销商,他有姓名,号码,经费这些属性
- Memento为Memento,为保存经销商属性的备忘录
- Caretaker为ProspectMemory,即保存经销商备忘录的类
UML类图:
C++代码如下:
#include <string>#include <iostream>using namespace std;class Memento{ public: Memento(string n,string p,double b) { name=n; phone=p; budget=b; } string getName() { return name; } string getPhone() { return phone; } double getBudget() { return budget; } private: string name; string phone; double budget;};class SalesProspect{ public: void setName(string n) { name=n; } void setPhone(string p) { phone=p; } void setBudget(double b) { budget=b; } string getName() { return name; } string getPhone() { return phone; } double getBudget() { return budget; } Memento* saveMemento() { return new Memento(name,phone,budget); } void restoreMemento(Memento * m) { name=m->getName(); phone=m->getPhone(); budget=m->getBudget(); } private: string name; string phone; double budget;};class ProspectMemory{ public: Memento * getMemento() { return memento; } void setMemento(Memento * m) { memento=m; } private: Memento * memento;};int main(){ SalesProspect * sale=new SalesProspect(); sale->setName("John"); sale->setPhone("15245869785"); sale->setBudget(1200); std::cout<<"base sale:"<<std::endl<<sale->getName()<<std::endl<<sale->getPhone()<<std::endl<<sale->getBudget()<<std::endl<<std::endl; ProspectMemory * prospect=new ProspectMemory(); prospect->setMemento(sale->saveMemento()); sale->setName("Mike"); sale->setPhone("13685478523"); sale->setBudget(1500); std::cout<<"change sale:"<<std::endl<<sale->getName()<<std::endl<<sale->getPhone()<<std::endl<<sale->getBudget()<<std::endl<<std::endl; sale->restoreMemento(prospect->getMemento()); std::cout<<"restore sale:"<<std::endl<<sale->getName()<<std::endl<<sale->getPhone()<<std::endl<<sale->getBudget()<<std::endl<<std::endl; delete sale; delete prospect; return 0;}
执行输出:
0 0
- 设计模式之十四:备忘录模式(Memento)
- 设计模式之备忘录模式(Memento)
- 设计模式之:备忘录模式(Memento)
- 设计模式之备忘录模式(Memento)
- 设计模式之备忘录模式(Memento)
- 设计模式实现(十四)--- 备忘录模式(Memento)
- 设计模式之Memento(备忘录)
- 设计模式----Memento(备忘录)
- 设计模式读书笔记之备忘录模式(Memento)
- 设计模式之备忘录模式Memento
- 设计模式之备忘录模式(Memento Pattern)
- java设计模式之备忘录模式Memento
- 设计模式之备忘录模式,memento
- 设计模式之备忘录模式(Memento)
- 设计模式入门之备忘录模式Memento
- 设计模式之备忘录模式(Memento)摘录
- 23设计模式之备忘录模式(Memento)
- 23设计模式之备忘录模式(Memento)
- MyBatis3整合Spring3、SpringMVC3
- hdu 1395 Minimum Transport Cost
- 关于站立会议的一些常见问题
- SQL注入漏洞全接触--高级篇 [3]
- Tiny服务的开发配套的工具来了
- 设计模式之十四:备忘录模式(Memento)
- 五、JAVA中类的探究-类变量的初始化时机
- objective-c与javascript交互
- asp.net页面去调用通过SSL加密的webservice报错
- Spring mvc 返回json格式
- mybatis 异常:There is no getter for property named 'classId' in 'class java.lang.Integer'
- Tiny代码生成框架
- Edit控件事件响应及自动换行,刷屏
- 对TinyTemplate进行性能优化过程简介