备忘录模式:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
适用性:
1、 必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前保存的状态。
2、 如果一个用接口来让其它对象直接得到这些状态,将会保留对象的实现细节并破坏对象的封装性。
结构图:
实现:
//备忘录,用于存储Originator的内部状态
class Memento
{
public:
Memento(string state):m_State(state)
{ }
voidSetState(string state)
{
m_State = state;
}
string GetState()
{
returnm_State;
}
protected:
private:
string m_State;
};
// Originator创建一个备忘录,用于记录当前时刻的状态,并用它来进行状态恢复。
class Originator
{
public:
Originator(string state):m_State(state)
{
}
voidSetState(string state)
{
m_State = state;
}
voidRestoredState(Memento *pMemento)
{
m_State = pMemento->GetState();
}
Memento *CreateMemento()
{
returnnew Memento(m_State);
}
voidShowState()
{
cout<<"Originator state is :"<<m_State<<endl;
}
protected:
private:
string m_State;
};
// CareTaker负责保存备忘录,不能访问备忘录的内容
class CareTaker
{
public:
voidSetMemento(Memento *pMemento)
{
m_pMemento = pMemento;
}
Memento *GetMemento()
{
returnm_pMemento;
}
protected:
private:
Memento *m_pMemento;
};
//初始化对象
Originator *pO = new Originator("StateA");
pO->ShowState();
//建立并保存Memento
CareTaker *pTaker = new CareTaker;
pTaker->SetMemento(pO->CreateMemento());
//改变状态
pO->SetState("StateB");
pO->ShowState();
//恢复状态
pO->RestoredState(pTaker->GetMemento());
pO->ShowState();