23种设计模式-备忘录(Memento)设计模式

文章目录

类图: 备忘录设计模式类图

一.什么是备忘录设计模式?

备忘录设计模式 (Memento Pattern)是一种行为型设计模式,用于在不暴露对象实现细节的前提下,捕获并保存对象在某一时刻的状态,以便之后可以将其恢复到之前的状态。该模式的主要目标是保存对象的状态并在需要时进行状态回滚。

二.备忘录模式的特点

  1. 封装状态:将对象的内部状态存储在备忘录中,并且不让外部访问这些状态细节。
  2. 提供撤销功能:支持撤销操作,特别适合需要恢复到之前状态的场景。
  3. 降低耦合:发起者(Originator)与管理备忘录的角色(Caretaker)解耦。

三.备忘录模式的结构

  1. Originator(发起者):负责创建备忘录并恢复自身状态。
  2. Memento(备忘录):存储发起者的状态。
  3. Caretaker(管理者) :负责保存和恢复备忘录。

四.备忘录模式的优缺点

  • 优点:
    • 提供了一种状态恢复机制。
    • 发起者的内部状态对外部透明。
  • 缺点:
    • 可能需要大量的存储空间,尤其是需要存储大量状态时。
    • 如果对象状态过于复杂,可能会增加备忘录的维护成本。

五.备忘录模式的 C++ 实现

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 备忘录类
class Memento {
private:
    string state;
public:
    Memento(const string& s) : state(s) {}
    string GetState() const { return state; }
};

// 发起者类
class Originator {
private:
    string state;
public:
    void SetState(const string& s) {
        state = s;
        cout << "Set state to: " << state << endl;
    }
    string GetState() const { return state; }
    Memento* CreateMemento() const {
        return new Memento(state);
    }
    void SetMemento(Memento* memento) {
        state = memento->GetState();
        cout << "Restored state to: " << state << endl;
    }
};

// 管理者类
class Caretaker {
private:
    vector<Memento*> mementos;
public:
    void SaveMemento(Memento* memento) {
        mementos.push_back(memento);
    }
    Memento* GetMemento(int index) const {
        if (index >= 0 && index < mementos.size()) {
            return mementos[index];
        }
        return nullptr;
    }
    ~Caretaker() {
        for (Memento* m : mementos) {
            delete m;
        }
    }
};

int main() {
    Originator originator;
    Caretaker caretaker;

    originator.SetState("State1");
    caretaker.SaveMemento(originator.CreateMemento());

    originator.SetState("State2");
    caretaker.SaveMemento(originator.CreateMemento());

    originator.SetState("State3");

    // 恢复到之前的状态
    originator.SetMemento(caretaker.GetMemento(0));
    originator.SetMemento(caretaker.GetMemento(1));

    return 0;
}

六.备忘录模式的 Java 实现

java 复制代码
import java.util.ArrayList;
import java.util.List;

// 备忘录类
class Memento {
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
}

// 发起者类
class Originator {
    private String state;
    public void setState(String state) {
        this.state = state;
        System.out.println("Set state to: " + state);
    }
    public String getState() {
        return state;
    }
    public Memento createMemento() {
        return new Memento(state);
    }
    public void setMemento(Memento memento) {
        this.state = memento.getState();
        System.out.println("Restored state to: " + state);
    }
}

// 管理者类
class Caretaker {
    private List<Memento> mementos = new ArrayList<>();
    public void saveMemento(Memento memento) {
        mementos.add(memento);
    }
    public Memento getMemento(int index) {
        if (index >= 0 && index < mementos.size()) {
            return mementos.get(index);
        }
        return null;
    }
}

public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State1");
        caretaker.saveMemento(originator.createMemento());

        originator.setState("State2");
        caretaker.saveMemento(originator.createMemento());

        originator.setState("State3");

        // 恢复到之前的状态
        originator.setMemento(caretaker.getMemento(0));
        originator.setMemento(caretaker.getMemento(1));
    }
}

七.总结

备忘录设计模式适用于需要保存对象状态并提供恢复功能的场景,比如文本编辑器、游戏存档等。通过将状态封装到备忘录中,备忘录模式实现了状态的透明保存与恢复,从而提升了系统的可维护性和灵活性。
应用场景:

  1. 文本编辑器:保存编辑状态,支持撤销和恢复操作。
  2. 游戏存档:保存玩家的游戏进度,并允许玩家恢复到之前的状态。
  3. 事务管理:数据库事务可以利用备忘录模式保存数据状态,实现事务回滚。
相关推荐
rannn_11111 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
qq_124987075315 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日21 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
艾莉丝努力练剑25 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day41 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
若鱼191944 分钟前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
Trouvaille ~1 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
觉醒大王1 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)1 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
feasibility.1 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode