备忘录模式
概念
Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象(原生对象)的内部状态到备忘录,并在需要的时候通过caretaker(保存了备忘录)提取备忘录的内容(undo/rollback)恢复原生对象以前的状态。
角色及职责
Originator(原生者)
需要被保存状态以便恢复的那个对象。Memento(备忘录)
该对象由Originator创建,主要用来保存Originator的内部状态。Caretaker(管理者)
负责在适当的时间保存/恢复Originator对象的状态。
适用于:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态。
适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。
案例
如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。
1)一个类需要保存它的对象的状态(相当于Originator角色)
2)设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
3)需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
4)undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态
/*******************************
*某个对象也许在将来有一天会恢复到现如今的状态,
*那么就必须找一个备忘录存储现如今的状态,以便找得到恢复的依据
*
*原生类需要依赖备忘录存储自己的信息
* --所以需要创建这个备忘录--函数返回值是备忘录
*
* 备忘录和原生类的属性几乎一样--很显然是为了记录原生类啊
*
*管理者需要保存备忘录的内容--实际上保存的就是原生对象的内部状态
* --需要备忘录做成员变量(关联)
* --构造函数需要备忘录做参数(依赖)
* --设置函数需要备忘录做参数
*
*******************************/
#include <iostream>
#include <string>
using namespace std;
/*备忘录--存放源对象的内部状态--不打破封装性*/
class Memto
{
public:
Memto(string name,int age)//构造函数创建备忘录
{
m_name = name;
m_age = age;
}
string getName()//获取缓存的属性--姓名
{
return m_name;
}
int getAge()//获取缓存的属性--年龄
{
return m_age;
}
private:
/*具有和原生类一样的属性*/
string m_name;
int m_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;
}
Memto * createMemto()//创建一个备忘录--目的是传递给管理者
{
return new Memto(m_name,m_age);
}
void setMemto(Memto * memto)//恢复内部状态--根据之前的备忘录恢复自己的状态--这个备忘录从管理者获取
{
m_name = memto->getName();
m_age = memto->getAge();
}
void printPerson()//打印信息
{
cout<<"name : "<<m_name << "age : "<<m_age<<endl;
}
private:
/*自己的私有属性--备忘录需要具有相关的属性--以便记录*/
string m_name;
int m_age;
};
/*管理者*/
class CareTaker
{
public:
CareTaker(Memto *mem)//利用备忘录构造管理者--接收已创建好的备忘录--保存备忘录
{
m_mem = mem;
}
/*根据已有的备忘录设置自己的备忘录成员--实质上就是进行保存备忘录的操作*/
void setmem(Memto *mem)
{
m_mem = mem;
}
/*获取备忘录--将备忘录提供给想要恢复状态的原生对象*/
Memto *getMem()
{
return m_mem;
}
private:
Memto * m_mem;//保存的备忘录
};
/*测试案例*/
int main()
{
Person * p = new Person("simon",22);//原生对象
CareTaker * care = NULL;//管理者
p->printPerson();
care = new CareTaker(p->createMemto());//原生对象创建备忘录
//管理者保存该备忘录
p->setAge(42);//原生对象内部状态发生改变
p->printPerson();
/*管理者提供自己已经保存的备忘录
*原生对象根据他提供的备忘录进行恢复
*/
p->setMemto(care->getMem());
p->printPerson();
return 0;
}