一,简介
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式输入行为模式。
二,角色
Originator
负责创建一个备忘录 Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
Memento
负责存储Originator对象的内部状态,并可防止Originator以外的其它对象访问备忘录
Caretaker
负责保存好备忘录
三,举例
首先保存一个状态,然后适当的时再恢复这个状态
1,类图
2,代码
class Memento {//备忘录
private:
string m_state;//状态 可以是多个
public:
Memento(string s):m_state(s){}
string GetState() { return m_state; }//获得状态
void SetState(string s) { m_state = s; }//设置状态
};
class Caretaker {//管理者
private:
Memento* m_memento;
public:
Memento* GetMemento() { return m_memento; }
void SetMemento(Memento* m) { m_memento = m; }
~Caretaker() { delete m_memento; }
};
class Originator {//发起人
private:
string m_state;//需要保存的属性 可以有多个
public:
string GetState() { return m_state; }
void SetState(string s) { m_state = s; }
Memento* CreateMemento() { return new Memento(m_state); }//创建备忘录 保存信息
void SetMemento(Memento* m) { m_state = m->GetState(); }//恢复备忘录
void Show() { cout << "state" << m_state << endl; }
};
int main()
{
//初始状态
Originator *o = new Originator();
o->SetState("On");
o->Show();
//创建备忘录 保存状态
Caretaker* c = new Caretaker();
c->SetMemento(o->CreateMemento());
o->SetState("Off");
o->Show();
o->SetMemento(c->GetMemento());//调用备忘录 恢复状态
o->Show();
system("pause");
return 0;
}
四,优缺点
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
五,使用场景
使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。
如:打游戏时的存档。 Windows 里的 ctri + z。 IE 中的后退。 数据库的事务管理
注意事项:
1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。