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 类过大时,每一次保存都会消耗很多内存
相关推荐
SL_staff1 小时前
从邮箱传文档到协同流重构:企业文档协作的系统性破局实践
java·开源·github
smallyoung2 小时前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga4 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff6 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3276 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar6 小时前
Java封装、继承、多态
java·开发语言
ly76896 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠6 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
高晶6 小时前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
奇牙coding7 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai