行为型模式-备忘录模式

发布时间 2023-11-14 21:27:05作者: Qt小罗

1 什么是备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象实现细节的情况下捕获并存储其内部状态,以后可以将对象恢复到先前的状态。备忘录模式可以帮助我们实现撤销、恢复等操作,同时也可以防止对象内部状态的直接访问和修改。

在备忘录模式中,包括以下几个关键角色:

  • Originator(发起人):负责创建一个备忘录,用于记录当前时刻的内部状态,以及使用备忘录恢复内部状态。
  • Memento(备忘录):用于存储Originator的内部状态,实现对Originator的状态存储和恢复。
  • Caretaker(负责人):负责保存备忘录,但不能对备忘录的内容进行操作和访问。

2 举个例子

下面以一个简单的文本编辑器的例子来说明备忘录模式。

#include <iostream>
#include <string>

// 备忘录类
class Memento {
private:
    std::string state;

public:
    Memento(const std::string& s) : state(s) {}

    std::string getState() const {
        return state;
    }
};

// 发起人类
class TextEditor {
private:
    std::string text;

public:
    void setText(const std::string& t) {
        text = t;
    }

    std::string getText() const {
        return text;
    }

    Memento createMemento() {
        return Memento(text);
    }

    void restoreFromMemento(const Memento& m) {
        text = m.getState();
    }
};

// 负责人类
class TextEditorCaretaker {
private:
    Memento memento;

public:
    void saveMemento(const Memento& m) {
        memento = m;
    }

    Memento retrieveMemento() {
        return memento;
    }
};

int main() {
    TextEditor textEditor;
    TextEditorCaretaker caretaker;

    textEditor.setText("This is the initial text.");
    caretaker.saveMemento(textEditor.createMemento()); // 保存初始状态

    textEditor.setText("This is an updated text."); // 修改文本
    std::cout << "Current text: " << textEditor.getText() << std::endl;

    textEditor.restoreFromMemento(caretaker.retrieveMemento()); // 恢复到初始状态
    std::cout << "Restored text: " << textEditor.getText() << std::endl;

    return 0;
}

在上面的示例中,TextEditor 是发起人类,负责维护文本和创建备忘录。Memento 是备忘录类,用于存储 TextEditor 的状态。TextEditorCaretaker 是负责人类,负责保存和恢复备忘录。

在示例中,我们首先保存了文本编辑器的初始状态作为备忘录,然后修改了文本内容。接着,通过负责人类将文本编辑器恢复到之前保存的状态,使得文本内容回到了初始状态。

3 总结

通过备忘录模式,我们可以保存对象的内部状态,并在需要时将其恢复,从而实现了状态的保存和撤销操作。