备忘录模式(Memento)
-
介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。
备忘录模式的核心是设计备忘录类以及用于管理备忘录的管理者类。 -
优点:
提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。 -
缺点:资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
-
主要角色。
发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
class MementoBase
{
public:
MementoBase(){}
virtual string GetState() = 0;
virtual void SetState(string state) = 0;
};
class OriginatorBase
{
public:
OriginatorBase(){}
virtual string GetState() = 0;
virtual void SetState(string state) = 0;
};
//备忘录
class Memento : public MementoBase
{
public:
Memento(){ m_state = ""; }
Memento(OriginatorBase *or)
{
m_state = or->GetState();
}
void SetState(string state){
m_state = state;
}
string GetState(){
return m_state;
}
private:
string m_state;
};
//发起人
class Originator: public OriginatorBase
{
public:
Originator(){
m_state = "";
}
Originator(string state) :m_state(state){}
void SetState(string state){
m_state = state;
cout << m_state << endl;
}
string GetState(){
return m_state;
}
//创建备忘录对象
Memento *CreateMemento()
{
return new Memento(this);
}
//利用备忘录对象恢复原发器状态
void RestoreMemento(MementoBase *m)
{
m_state = m->GetState();
cout << m_state << endl;
}
private:
string m_state;
};
//管理者
class Caretaker
{
public:
Caretaker(){}
Memento *GetMemento()
{
return pMemento;
}
void SetMemento(Memento *m)
{
pMemento = m;
cout << m->GetState() << endl;
}
private:
Memento *pMemento;
};
int main()
{
//创建原发器对象
Originator *Ori = new Originator("状态1");
//创建负责人对象
Caretaker *Ca = new Caretaker();
Ca->SetMemento(Ori->CreateMemento());
Ori->SetState("状态2");
// 从负责人对象中取出备忘录对象,实现撤销
Ori->RestoreMemento(Ca->GetMemento());
system("pause");
return 1;
}