设计模式-备忘录模式

定义

备忘录模式(Memento Pattern)是一种对象行为型模式,又叫快照模式,别名为Token。这种模式允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。备忘录模式的发起人(Originator)角色会记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能。备忘录(Memento)角色负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。管理者(Caretaker)角色对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

实现举例

  • 用Originator类来表示要保存和恢复状态的对象。这个类定义了如何创建备忘录(即保存状态),以及如何从备忘录中恢复状态。
c++ 复制代码
#include <iostream>
#include <string>

// 原发器类
class Originator {
public:
    // 定义一些可能会随时间变化的重要数据
    std::string state;

    // 创建一个新的备忘录
    Memento createMemento() {
        return Memento(state);
    }

    // 从备忘录中恢复状态
    void restoreFromMemento(Memento m) {
        state = m.getState();
    }

    // 改变原发器的状态
    void setState(std::string newState) {
        std::cout << "State changed to: " << newState << std::endl;
        state = newState;
    }

private:
    // 省略其他私有成员变量和方法
};

// 备忘录接口
class Memento {
public:
    virtual ~Memento() {}
    virtual std::string getState() const = 0;
};

// 具体的备忘录类
class ConcreteMemento : public Memento {
public:
    ConcreteMemento(const std::string& state)
        : state_(state) {}

    std::string getState() const override {
        return state_;
    }

private:
    std::string state_;
};
  • 用Caretaker类来管理和存储备忘录。这个类通常包含一个栈或其他数据结构来保存备忘录,并可以使用这些备忘录来恢复原发器的状态。
c++ 复制代码
cpp
#include <stack>

// 管理者类
class Caretaker {
public:
    void setMemento(Memento* memento) {
        mementos_.push(memento);
    }

    Memento* getMemento() {
        if (!mementos_.empty()) {
            auto memento = mementos_.top();
            mementos_.pop();
            return memento;
        }
        return nullptr;
    }

private:
    std::stack<Memento*> mementos_;
};
  • 简单的测试程序来演示备忘录模式的用法。
c++ 复制代码
cpp
int main() {
    Originator originator;
    Caretaker caretaker;

    // 设置初始状态
    originator.setState("State 1");
    std::cout << "Current state: " << originator.state << std::endl;

    // 创建第一个备忘录
    Memento* memento1 = originator.createMemento();

    // 更改状态
    originator.setState("State 2");
    std::cout << "Current state: " << originator.state << std::endl;

    // 创建第二个备忘录
    Memento* memento2 = originator.createMemento();

    // 恢复到第一个备忘录的状态
    caretaker.setMemento(memento2);
    originator.restoreFromMemento(*caretaker.getMemento());
    std::cout << "Current state after restoring from second memento: "
              << originator.state << std::endl;

    // 恢复到原始状态
    caretaker.setMemento(memento1);
    originator.restoreFromMemento(*caretaker.getMemento());
    std::cout << "Current state after restoring from first memento: "
              << originator.state << std::endl;

    delete memento1;
    delete memento2;

    return 0;
}

总结

备忘录模式是一种对象行为型模式,其主要优点如下:

  1. 提供了一种可以恢复状态的机制,当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  2. 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  3. 简化了发起人类,发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
相关推荐
老蒋每日coding2 小时前
AI Agent 设计模式系列(十九)—— 评估和监控模式
人工智能·设计模式
会员果汁2 小时前
23.设计模式-解释器模式
设计模式·解释器模式
「QT(C++)开发工程师」9 小时前
C++设计模式
开发语言·c++·设计模式
茶本无香10 小时前
设计模式之七—装饰模式(Decorator Pattern)
java·设计模式·装饰器模式
漂洋过海的鱼儿1 天前
设计模式——EIT构型(三)
java·网络·设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(十八)—— 安全模式
人工智能·安全·设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(十六)—— 资源感知优化设计模式
人工智能·设计模式·langchain
老蒋每日coding1 天前
AI Agent 设计模式系列(十七)—— 推理设计模式
人工智能·设计模式
冷崖1 天前
桥模式-结构型
c++·设计模式
连山齐名1 天前
设计模式之一——堵塞队列
设计模式