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 类过大时,每一次保存都会消耗很多内存
相关推荐
姓蔡小朋友10 分钟前
Java 定时器
java·开发语言
crossaspeed10 分钟前
Java-SpringBoot的启动流程(八股)
java·spring boot·spring
这儿有个昵称30 分钟前
互联网大厂Java面试场景:从Spring框架到微服务架构的提问解析
java·spring boot·微服务·kafka·grafana·prometheus·数据库优化
2401_8823515235 分钟前
Flutter for OpenHarmony 商城App实战 - 地址编辑实现
android·java·flutter
爬山算法44 分钟前
Hibernate(47)Hibernate的会话范围(Scope)如何控制?
java·后端·hibernate
雨中飘荡的记忆1 小时前
Caffeine入门到实战
java
砚边数影1 小时前
AI开发依赖引入:DL4J / Java-ML 框架 Maven 坐标配置
java·数据库·人工智能·深度学习·机器学习·ai·maven
一路向北North1 小时前
nacos更改配置值后,应用提示Refresh keys changed 但是注入的值没有发生变化
java
黎雁·泠崖1 小时前
Java面向对象:this关键字+构造方法+标准JavaBean
java·开发语言·python
sheji34162 小时前
【开题答辩全过程】以 基于Java的智慧环卫垃圾收运管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言