基本概念:
动机:
在软件构建过程中某些对象的状态在转换过程中由于某种需要要求程序可以回溯到之前对象某个所处的状态;如文档编辑器的撤销动作、游戏的存档等。
定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便于在不同时机可以切换到不同的状态中。
代码举例:
备忘录状态类:
描述元发器所有可能变化的状态的类,这里以string字符串记录(实际中对象常可很方便的序列化)。
//备忘录状态类
class Memento
{string state;//..
public:Memento(const string & s) : state(s) {}string getState() const { return state; }void setState(const string & s) { state = s; }
};
元发起类:
业务类,会有状态变化,在需要记录当前状态时可以Memento*createMemento()创建当前状态供备忘录管理类记录,在需要恢复某一状态时可以通过restoreMemento(Memento*m)恢复状态m。
//业务中 元发器
class Originator
{string state;//....
public:Originator() {}~Originator(){}//业务相关函数 会修改当前状态state/*...*///创建备忘录记录Memento* createMemento() {return new Memento(state);}//恢复备忘录void restoreMemento(Memento*m){state = m->getState();}};
备忘录管理类:
记录元发器创建的状态,在元发器业务需要恢复某一状态时提供状态便于其恢复。
class MemManager
{
public:MemManager() {};~MemManager() {for (auto iter = m_MementoVec.begin(); iter != m_MementoVec.end(); iter++){delete (*iter);}}void setMomento(Memento* m) {m_MementoVec.push_back(m);}Memento* getMemento(int index){return m_MementoVec.at(index);}Memento* getLastMemento(){return m_MementoVec.at(m_MementoVec.size() - 1);}private:vector<Memento*>m_MementoVec;
};
调用示例:
int main()
{Originator orginator;MemManager memManger;//捕获对象状态,存储到备忘录memManger.setMomento(orginator.createMemento());//... 改变orginator状态memManger.setMomento(orginator.createMemento());//... 改变orginator状态//从备忘录中恢复最初状态orginator.restoreMemento(memManger.getMemento(0));//恢复最近一次备忘录 撤销操作orginator.restoreMemento(memManger.getLastMemento());
}