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 类过大时,每一次保存都会消耗很多内存
相关推荐
文丑颜不良啊8 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发8 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力8 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力8 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A9 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵9 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
nice_lcj5209 小时前
Java 并发容器入门:ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列
java·面试·并发编程·阻塞队列·concurrenthashmap·copyonwritearraylist
微小的鱼9 小时前
Linux的渲染与显示系统链路
android·java·linux
是2的10次方啊10 小时前
设计模式与生活⑮:看到哪儿了,得有个地方替你记着
设计模式
若亦_10 小时前
Java中关于this的三种用法
java·开发语言·intellij-idea