备忘录模式

来源:互联网 发布:北京大学博士待遇 知乎 编辑:程序博客网 时间: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;}