概念
此模式可在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
将对象状态的副本存储在一个名为备忘录的特殊对象中。除了创建备忘录的对象外,任何对象都不能访问备忘录的内容。
代码示例
代码来自这里。
class Memento // 备忘录类
{
public:
Memento(QString state) :state(state) {}
const QString getState() const
{
return state;
}
void setState(QString state)
{
this->state = state;
}
private:
QString state;
};
//具有状态的对象,状态可变
class Originator
{
public:
Originator(QString state) :state(state){}
Memento* createMemento()
{
return new Memento(state);
}
void setMemento(Memento *memento)
{
state = memento->getState();
}
void changeState(QString state)
{
this->state = state;
}
void showState()const
{
qDebug() << "state==" << state;
}
private:
QString state;
};
class Caretaker // 管理者类
{
public:
Caretaker(Originator *originator) : originator(originator){}
~Caretaker()
{
qDeleteAll(mementos);
}
void save(Memento *memento) // 记录备忘录某一时刻的状态
{
mementos.push_back(memento);
}
void undo(int index) // 返回备忘录某个时刻index的状态
{
originator->setMemento(mementos.at(index));
}
private:
QList<Memento*> mementos; // 不需要在参数列表初始化
Originator *originator;
};
int main(int argc, char *argv[])
{
Originator *originator = new Originator(QString { "初始状态" });
Caretaker *caretaker = new Caretaker(originator);
caretaker->save(originator->createMemento()); // 保存初始状态
originator->showState(); // 打印初始状态
originator->changeState(QString{ "状态1" }); // 状态发生改变1
caretaker->save(originator->createMemento());
originator->showState();
originator->changeState(QString{ "状态2" }); // 状态发生改变2
caretaker->save(originator->createMemento());
originator->showState();
caretaker->undo(0); // 返回到最初状态
originator->showState();
return 0;
}