【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++示例代码:

cpp 复制代码
#include <iostream>
#include <stack>
#include <string>

// 备忘录
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;
}

输出结果

cpp 复制代码
Current Text: Hello, Memento!

Restored Text: Hello, World!

解释

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

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

结论

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

应用场景

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

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

相关推荐
ROC_bird..6 分钟前
STL - vector的使用和模拟实现
开发语言·c++
机器视觉知识推荐、就业指导6 分钟前
C++中的栈(Stack)和堆(Heap)
c++
hxj..1 小时前
【设计模式】外观模式
java·设计模式·外观模式
吾与谁归in1 小时前
【C#设计模式(10)——装饰器模式(Decorator Pattern)】
设计模式·c#·装饰器模式
Mr_Xuhhh2 小时前
递归搜索与回溯算法
c语言·开发语言·c++·算法·github
无敌岩雀2 小时前
C++设计模式行为模式———命令模式
c++·设计模式·命令模式
爱吃生蚝的于勒4 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据6 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
versatile_zpc9 小时前
C++初阶:类和对象(上)
开发语言·c++
小鱼仙官9 小时前
MFC IDC_STATIC控件嵌入一个DIALOG界面
c++·mfc