备忘录模式:
后悔药来啦!!!备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时能将该对象恢复到原先保存的状态。
备忘录模式的角色:
- 发起人(Originator):记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
- 管理者(CareTaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
备忘录模式的应用场景:
- 需要保存/恢复数据的相关状态场景。
- 提供一个可回滚的操作。
class STMemento
{
private:
int iVitality;
public:
STMemento(){}
STMemento(int iVitality)
{
this->iVitality = iVitality;
}
int GetVitality() const
{
return this->iVitality;
}
};
//-------------------------------------------------------
class STOriginator
{
private:
int iVitality;
string name;
public:
STOriginator(string strName, int iVit): iVitality(iVit), name(strName)
{
}
STMemento* SaveState()
{
return new STMemento(iVitality);
}
void RecoverState(const STMemento* stMemento)
{
this->iVitality = stMemento->GetVitality();
}
void SetVitality(int iVit)
{
this->iVitality = iVit;
}
void Show()
{
cout<< "Name: "<< name<< endl;
cout<< "Live: "<< iVitality<< endl;
}
};
//-------------------------------------------------------
class STCareTaker
{
private:
vector<STMemento*> vecStMemento;
public:
void AddMemento(STMemento* stMemento)
{
vecStMemento.push_back(stMemento);
}
STMemento* GetMemento(int Iindex)
{
if (Iindex >= vecStMemento.size())
return NULL;
else
return vecStMemento[Iindex];
}
};
//-------------------------------------------------------
//use
STOriginator* pstOriginator = new STOriginator("xxx", 100);
cout<< "原始状态: "<< endl;
pstOriginator->Show();
STCareTaker* pstCareTaker = new STCareTaker();
pstCareTaker->AddMemento(pstOriginator->SaveState());
pstOriginator->SetVitality(50);
cout<< "战斗后状态: "<< endl;
pstOriginator->Show();
pstOriginator->RecoverState(pstCareTaker->GetMemento(0));
cout<< "归档后状态: "<< endl;
pstOriginator->Show();