• 【C++设计模式之备忘录模式:行为型】分析及示例


    简介

    备忘录模式(Memento Pattern)是一种行为型设计模式,它用于保存和恢复对象的状态。备忘录模式通过将对象的状态封装成一个备忘录(Memento),并将备忘录保存在一个管理者(Caretaker)中,来实现对对象状态的保存和恢复。

    备忘录模式的核心思想是将对象的状态封装成一个备忘录对象,而不是直接暴露状态给其他对象。这样,其他对象就无法直接操作对象的状态。同时,备忘录模式还提供了一个管理者对象,用于保存和管理备忘录,可以实现对对象状态的保存和恢复。

    描述

    备忘录模式由三个核心组件组成:Originator(原始对象)、Memento(备忘录和Caretaker(管理者)。

    • Originator类保存了需要保存状态的对象,并能够根据当前状态创建备忘录和从备忘录中恢复原始状态。
    • Memento类是备忘录对象,负责保存Originator对象的状态。
    • Caretaker类是管理者对象,负责保存备忘录对象,提供了对备忘录的保存、获取和恢复功能。

    原理

    备忘录模式通过将对象的状态保存在备忘录对象中,将备忘录对象保存在管理者对象中,来实现对对象状态的保存和恢复。当需要保存当前状态时,Originator对象会创建一个包含状态的备忘录对象,并将备忘录对象交给Caretaker对象保存。当需要恢复到之前的状态时,Originator对象会从Caretaker对象获取对应的备忘录对象,并根据备忘录对象中保存的状态恢复原始状态。

    1.创建一个备忘录,该类用于存储原发器的状态。
    2.创建一个原发器类,该类拥有需要保存和恢复的状态,并提供保存状态和恢复状态的方法。
    3.创建一个管理者类,用于管理备忘录对象的保存和获取。
    4.在需要保存原发器状态的时候,原发器创建一个备忘录对象,并将自己的状态传递给备忘录对象。
    5.管理者对象保存备忘录对象。
    6.在需要恢复原发器状态的时候,管理者对象将备忘录对象交还给原发器。

    类图

    在这里插入图片描述

    示例

    假设有一个文本编辑器,用户可以输入文本并进行编辑操作。当用户希望撤销一些编辑操作时,可以使用备忘录模式保存编辑器状态。

    在示例中,有三个主要类:

    1. Editor(原发器):表示文本编辑器,具有保存和恢复状态的方法,以及一个用于保存和获取备忘录的方法。
    2. EditorState(备忘录):表示编辑器的状态,保存了编辑器的文本内容。
    3. EditorHistory(管理者):管理备忘录对象的保存和获取。

    C++示例代码:

    #include 
    #include 
    #include 
    
    // 备忘录
    class Memento {
    public:
        Memento(const std::string& text) : text(text) {}
    
        std::string getText() const {
            return text;
        }
    
    private:
        std::string text;
    };
    
    // 原始对象
    class TextEditor {
    public:
        void setText(const std::string& text) {
            this->text text;
        }
    
        Memento createMemento() {
            return Memento(text);
        }
    
        void restoreFromMemento(const Memento& memento) {
            text = m.getText();
        }
    
        void printText() {
            stdcout << text << std::endl;
        }
    
    private:
        std::string text;
    };
    
    // 管理者
    class Caretaker {
    public:
        void saveMemento(const Memento& memento)
        {
        	mementos.push(memento);
        }
    
        Memento getMemento() {
     if (!mementos.empty()) {
                Memento memento = mementos.top();
                mementos.pop();
                return memento;
            } else {
                return Memento("");
            }
        }
    
    private:
        std::stack<Memento> mementos;
    };
    
    int main() {
        TextEditor editor;
        Caretaker caretaker;
    
        // 设置初始文本
        editor.setText("Hello, World!");
    
        // 保存文本状态
        caretaker.saveMemento(editor.createMemento());
    
        // 修改文本
        editor.setText("Hello, Memento!");
    
        // 打印当前文本
        std::cout << "Current Text: ";
        editor.printText();
    
        // 恢复到之前的状态
        Memento m = caretaker.getMemento();
        editor.restoreFromMemento(memento);
    
        // 再次打印文本
        std::cout << "Restored Text: ";
        editor.printText();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

    输出结果

    Current Text: Hello, Memento!
    
    Restored Text: Hello, World!
    
    • 1
    • 2
    • 3

    解释

    在上述示例中,TextEditor类是原始对象(Originator),它保存了需要保存状态的文本,并提供了创建备忘录和从备忘录中恢复状态的方法。Memento类是备忘录(Memento),它负责保存TextEditor对象的状态。Caretaker类是管理者(Caretaker),它负责保存备忘录对象,并提供了对备忘录的保存和获取功能。

    首先设置初始文本为"Hello, World!“,并保存初始状态。然后,我们修改文本为"Hello, Memento Pattern!”,并打印当前文本。接下来,我们从Caretaker对象获取之前保存的备忘录对象,并将文本恢到之前的状态。最后,再次打印文本,可以看到文本已经恢复为之前保存的状态。

    结论

    备忘录模式通过将对象的状态保存到备忘录对象中,并在的时候将其恢复,实现了对对象状态的保存和恢复功能,同时保持了对象的封装性。该模式可以用于需要可撤销操作或历史记录功能的场景。

    应用场景

    • 需要保存和恢复对象状态的场景,例如文本编辑器、操作撤销功能等。
    • 需要实现多级撤销操作的场景,例如图形编辑器中的多层次撤销操作。
    • 需要保存对象历史记录的场景,例如编辑器的编辑历史记录。
    • 需要实现对象副本功能的场景,在特定时候将对象恢复到某个历史状态。

    总之,备忘录模式提供了一种简单且有效的方法来保存和恢复对象的状态,可以在需要保存对象状态的场景中很好地发挥作用。

  • 相关阅读:
    verdi -play选项加载settings,执行一些自定义的初始化Verdi命令
    设计模式学习(八):桥接模式
    重生之我是一名程序员 33
    力扣383. 赎金信
    SpringCloud微服务(九)——Ribbon负载均衡
    SpringBoot数据层解决方案/ 内置持久化解决方案JdbcTemplate使用/内置数据库H2使用以及RedisNoSql使用
    LeetCode,二叉搜素树
    Mybatis-Plus中的and和or用法
    OpenAI将发布DALL·E3,多模态输出模式引爆热点
    FRP远程连接
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133622508