备忘录模式
来源:互联网 发布:北京大学博士待遇 知乎 编辑:程序博客网 时间:2024/06/08 19:19
1、概念:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先的状态。
2、角色和职责:
Originator (原生者)
需要保存状态以便被恢复的那个状态
Mememto(备忘录)
该对象由Originator创建,主要用来保存Originator的内部状态
Caretaker(管理者)
负责在适当的时间保存/恢复Originator对象的状态。
3、适用范围:
需要提供保存和恢复数据的相关状态场景
提供一个可回滚rollback操作
需要监控的副本场景。
数据库连接的事务管理就是备忘录模式
注意事项:
备忘录的声明期:作用在最近的代码。不使用就立即删除。..备忘录不是华佗在世,起死回生
备忘录的性能:不能用在for中,不能用频繁建立。消耗资源太多,这会是设计重构的前兆
4、示例代码:
#include<iostream>#include<string>using namespace std;// Caretaker 管理者// MememTo备忘录class MememTo{public:MememTo(string name, int age){m_name = name;m_age = age;}string getName(){return m_name;}int getAge(){return m_age;}void setName(string name){m_name = name;}void setAge(int age){m_age = age;}private:stringm_name;intm_age;};class Person{public:Person(string name,int age){m_name = name;m_age = age;}string getName(){return m_name;}int getAge(){return m_age;}void setName(string name){m_name = name;}void setAge(int age){m_age = age;}// 保存MememTo *createMememTo(){return new MememTo(m_name, m_age);}// 还原void setMememTo(MememTo* memto){m_age = memto->getAge();m_name = memto->getName();}void printT(){cout << "m_name: " << m_name << ", m_age: " << m_age << endl;}private:stringm_name;intm_age;};class Caretaker{public:Caretaker(MememTo *memto){m_memto = memto;}MememTo *getMememTo(){return m_memto;}void setMememTo(MememTo *mememto){m_memto = mememto;}private:MememTo * m_memto;};void test1(){MememTo *memto = NULL;Person *p = new Person("张三",32);p->printT();// 创建Person的一个对象状态cout << "------------------------" << endl;memto = p->createMememTo();p->setAge(26);p->printT();cout << "还原旧的状态" << endl;p->setMememTo(memto);p->printT();delete memto;delete p;}void test2(){//MememTo *memto = NULL;Caretaker *caretaker = NULL;Person *p = new Person("张三", 32);p->printT();// 创建Person的一个对象状态cout << "------------------------" << endl;caretaker = new Caretaker(p->createMememTo());p->setAge(26);p->printT();cout << "还原旧的状态" << endl;p->setMememTo(caretaker->getMememTo());p->printT();delete caretaker;delete p;}int main(void){//test1();test2();return 0;}
阅读全文
0 0
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 备忘录模式
- 理解执行环境、作用域链和活动对象 (转载)
- C语言中sizeof对数组和对指针操作的不同,以及sizeof中表达式赋值问题
- Java:String和Date、Timestamp之间的转换
- ccfcsp 201709-1 打酱油
- 【观察】VMware全面云化四部曲 背后的新突破与新跨越
- 备忘录模式
- Java 算法 当前值是前两个值之和
- windows下codeblocks报错undefined reference to `WSAStartup@8'|
- 简单的hadoop程序开发
- C语言结构体部分知识
- ROS机器人程序设计(原书第2版)补充资料 (零) 源代码等
- sip 报错
- colorAccent,colorPrimary,colorPrimaryDark……关于颜色的一切?
- 常用测试管理工具对比