23种设计模式-行为型模式之备忘录模式(Java版本)

Java 备忘录模式(Memento Pattern)详解

🧠 什么是备忘录模式?

备忘录模式是一种行为型设计模式,它允许在不暴露对象实现细节的情况下,保存和恢复对象的状态。备忘录模式常常用于需要记录对象状态以便随时恢复的场景,如实现撤销操作、版本控制等。


🎯 使用场景

  • 需要保存对象的状态,以便以后恢复
  • 支持对象的撤销功能
  • 对象的状态改变需要被保存,且不希望暴露给外部

🏗️ 模式结构

  • Memento(备忘录):存储对象的内部状态,可以将状态保存在对象中
  • Originator(发起人):创建备忘录,保存当前的内部状态,并可以恢复到先前保存的状态
  • Caretaker(看护者):负责保存备忘录,但不能修改备忘录的内容,仅能调用恢复功能

✅ 示例:编辑器撤销操作

备忘录类

java 复制代码
public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

发起人类

java 复制代码
public class Editor {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public Memento saveState() {
        return new Memento(content);
    }

    public void restoreState(Memento memento) {
        this.content = memento.getState();
    }
}

看护者类

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

public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void addMemento(Memento memento) {
        mementoList.add(memento);
    }

    public Memento getMemento(int index) {
        return mementoList.get(index);
    }
}

客户端

java 复制代码
public class Client {
    public static void main(String[] args) {
        Editor editor = new Editor();
        Caretaker caretaker = new Caretaker();

        editor.setContent("Hello");
        caretaker.addMemento(editor.saveState());  // 保存当前状态

        editor.setContent("Hello, World!");
        caretaker.addMemento(editor.saveState());  // 保存新状态

        System.out.println("Current Content: " + editor.getContent());  // 输出:Hello, World!

        editor.restoreState(caretaker.getMemento(0));  // 恢复到旧状态
        System.out.println("Restored Content: " + editor.getContent());  // 输出:Hello
    }
}

✅ 优点

  • 可以保存和恢复对象的状态,支持撤销操作
  • 发起人对象不需要暴露其内部实现细节
  • 备忘录对象是只读的,不可以修改,有助于封装状态

⚠️ 缺点

  • 如果备忘录保存了过多的状态,可能会占用大量内存
  • 增加了类的数量,导致系统复杂度增加

🧩 使用建议

备忘录模式适合需要记录对象状态并支持恢复功能的场景,如文本编辑器的撤销操作、游戏的存档功能等。

相关推荐
weixin_460443568 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w11 小时前
什么是AOP
java
Cc.Y11 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck11 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870511 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev11 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha11 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞11 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
colinu12 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
蜗牛互联网12 小时前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端