C++ QT设计模式:备忘录模式

基本概念

备忘录模式(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是发起者,调用撤销框架来实现复原。

相关推荐

  1. 设计模式-备忘录模式

    2024-05-10 11:54:10       34 阅读
  2. 设计模式——备忘录模式

    2024-05-10 11:54:10       36 阅读
  3. 设计模式备忘录模式

    2024-05-10 11:54:10       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-10 11:54:10       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-10 11:54:10       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-10 11:54:10       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-10 11:54:10       18 阅读

热门阅读

  1. Visual Studio和Visual Studio Code适用于哪些编程语言

    2024-05-10 11:54:10       9 阅读
  2. DevOps技术栈(Nginx)

    2024-05-10 11:54:10       9 阅读
  3. c#:求所有水仙花数的和

    2024-05-10 11:54:10       9 阅读
  4. 1329. 将矩阵按对角线排序

    2024-05-10 11:54:10       13 阅读
  5. RUST编程语言入门基础2024

    2024-05-10 11:54:10       13 阅读
  6. 算法题:动态规划

    2024-05-10 11:54:10       12 阅读
  7. webpack4和webpack5区别4---自动清除打包目录

    2024-05-10 11:54:10       9 阅读
  8. .net 生成二维码图片

    2024-05-10 11:54:10       8 阅读
  9. 对话机器人技术解说

    2024-05-10 11:54:10       10 阅读
  10. 金融名词剖析:77个“支付近义词”辨析

    2024-05-10 11:54:10       12 阅读