基本概念
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象到先前的状态。
实现的模块有:
-
Originator(发起者):需要被备忘的对象,负责创建 Memento 和从 Memento 中恢复状态的接口。
-
Memento(备忘录):存储 Originator 对象的内部状态,通常只允许 Originator 访问。
-
Caretaker(负责人):负责保存备忘录对象,但不对备忘录的内容进行操作。
使用场景
-
需要保存对象的状态,以便随时恢复到该状态时。
-
需要保存对象的状态,并且不希望其他对象访问具体内容时。
实现
QT的撤销框架
QT的撤销框架可以实现保存和恢复之前的状态,主要涉及:
-
QUndoStack:对应 Caretaker(负责人),负责管理撤销和重做操作,维护命令的历史记录。
-
QUndoCommand:对应Memento(备忘录),用于封装对象的状态变化,保存状态的快照。如果没有Originator(发起者),那么其本身就是发起者,是需要被保存的对象。
class MyObject { public: void setState(const QString& state) { m_state = state; } QString getState() const { return m_state; } private: QString m_state; }; class MyUndoCommand : public QUndoCommand { public: MyUndoCommand(MyObject* obj, const QString& newState, QUndoCommand* parent = nullptr) : QUndoCommand(parent), m_obj(obj), m_newState(newState), m_oldState(obj->getState()) {} void redo() override { m_obj->setState(m_newState); } void undo() override { m_obj->setState(m_oldState); } private: MyObject* m_obj; QString m_oldState; QString m_newState; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); MyObject obj; QUndoStack *undoStack = new QUndoStack(&obj); MyUndoCommand *command1 = new MyUndoCommand(&obj, "State 1"); undoStack->push(command1); undoStack->redo(); // 保存状态 undoStack->undo(); // 复原状态 return a.exec(); }
上面的例子中,MyObject是发起者,调用撤销框架来实现复原。