23种设计模式-17备忘录模式

备忘录模式

适合阅读本专栏的人群包括:

  • 想提升代码质量和架构思维的 Java 开发者
  • 在工作中面对复杂业务、代码难以维护的工程师
  • 想准备面试、系统复习设计模式知识的同学

阅读完本专栏,你将掌握:

  • 23 种设计模式的结构、适用场景和最佳实践
  • 面向对象六大设计原则的使用方式
  • 如何用设计模式解决常见业务场景问题
  • 如何重构低质量代码,提升扩展性与可维护性

任何问题都可以在留言区指出,作者看到后会第一时间回复。

概念总是生僻的,可以结合代码多体会多练习。

如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。

其他模式详解:设计模式入门

备忘录 模式(Memento Pattern)是一种行为 设计模式,它允许在不破坏封装的前提下捕获和恢复对象的内部状态,从而在需要时将对象恢复到之前的状态。备忘录模式主要用于保存和恢复对象的状态,例如撤销操作。

备忘录模式的结构

适用场景

当一个对象需要能回退到过去某一个成功状态,并且不希望外部访问其内部结构时,就应使用备忘录模式。

如各种编辑器的撤回功能,粘贴板的历史功能等。

结构

  • 备忘录(Memento):存储原发器对象的内部状态,在需要时提供原发器对象的状态。
  • 原发器(Originator):创建一个含有当前内部状态的备忘录,并且可以使用备忘录恢复内部状态。
  • 负责人(Caretaker):负责保存好备忘录,但不能对备忘录的内容进行操作或检查。

代码示例

下面我们将创建一个简单的文本编辑器应用,用户可以输入文本并撤销输入。

备忘录(Memento)

  • 存储原发器对象的状态。只提供获取状态的方法,没有设置状态的方法。

原发器(Originator)

  • 创建一个含有当前状态的备忘录,并可以使用备忘录恢复内部状态。提供设置和获取状态的方法。

负责人(Caretaker)

  • 负责保存备忘录,但不能对备忘录的内容进行操作或检查。可以添加和获取备忘录。

客户端(Client)

  • 创建原发器对象和负责人对象,设置原发器的状态,并保存状态到备忘录中。通过负责人获取备忘录并恢复原发器的状态。
java 复制代码
// 备忘录类
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;
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 负责人类
class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento state) {
        mementoList.add(state);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }
}
// 客户端
public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State #1");
        originator.setState("State #2");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #3");
        caretaker.add(originator.saveStateToMemento());

        originator.setState("State #4");
        System.out.println("Current State: " + originator.getState());

        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("First saved State: " + originator.getState());

        originator.getStateFromMemento(caretaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }
}

总结

优点:

  1. 简化发起人实体类(Originator)职责,隔离状态存储与获取,实现了信息的封装,客户端 无需关心状态的保存细节;
  2. 提供回滚功能

缺点:

  1. 消耗资源:如果需要保存的状态过多 Memento 类过大时,每一次保存都会消耗很多内存
相关推荐
若鱼19192 分钟前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王10 分钟前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)18 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
feasibility.19 分钟前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
码农小卡拉28 分钟前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮35 分钟前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu37 分钟前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h42 分钟前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了44 分钟前
Java中的集合
java·开发语言
BD_Marathon1 小时前
七大设计原则介绍
设计模式