23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例

简介: 【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。

备忘录模式(Memento Pattern)

备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。

概念

  • 发起人(Originator):创建一个包含当前状态的备忘录,并使用备忘录恢复内部状态。
  • 备忘录(Memento):存储发起人的内部状态,并防止除发起人之外的其他对象访问备忘录。
  • 管理者(Caretaker):负责保存备忘录对象,但不会修改或检查备忘录的内容。

优点

  1. 提供了一种状态回滚的机制:允许对象回到之前的状态,适用于功能如撤销、重做等场景。
  2. 保存状态信息的封装性:不会破坏对象的封装边界,备忘录仅对发起人公开状态信息。
  3. 简化了发起人的职责:发起人不需要管理和保存其状态的历史,这些工作由备忘录和管理者负责。

缺点

  1. 可能会占用大量内存:如果频繁保存状态,且状态数据较大,可能会占用大量内存。
  2. 难以维护各个历史版本之间的依赖关系:在复杂的对象状态图中,维护不同版本的状态可能会很复杂。

Java代码示例

考虑一个简单的文本编辑器,可以保存和恢复文本状态的示例:

java复制代码

// 发起人
class Editor {
    private String text;

    // 设置文本
    public void setText(String text) {
        this.text = text;
    }

    // 保存状态到备忘录
    public Memento save() {
        return new Memento(text);
    }

    // 从备忘录恢复状态
    public void restore(Memento memento) {
        this.text = memento.getText();
    }
}

// 备忘录
class Memento {
    private final String text;

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

    public String getText() {
        return text;
    }
}

// 管理者
class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

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

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

// 客户端代码
public class MementoDemo {
    public static void main(String[] args) {
        Editor editor = new Editor();
        Caretaker caretaker = new Caretaker();

        editor.setText("State1");
        caretaker.addMemento(editor.save());
        editor.setText("State2");
        caretaker.addMemento(editor.save());

        // 恢复到第一个保存的状态
        editor.restore(caretaker.getMemento(0));
        System.out.println("Current State: " + editor.getText());
    }
}

在这个例子中,Editor 类代表发起人,它可以创建和使用 Memento 对象来保存和恢复自己的状态。Memento 类是备忘录,存储 Editor 的状态。Caretaker 类负责存储 Memento 对象,但不会修改或直接访问这些对象的内容。通过这种方式,Editor 的状态可以在不违反封装原则的情况下被保存和恢复。

相关文章
|
18小时前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
6 1
|
18小时前
|
设计模式 Java
Java一分钟之-设计模式:观察者模式与事件驱动
【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。
5 1
|
1天前
|
设计模式 SQL 安全
Java一分钟之-设计模式:单例模式的实现
【5月更文挑战第16天】本文介绍了单例模式的四种实现方式:饿汉式(静态初始化)、懒汉式(双检锁)、静态内部类和枚举单例,以及相关问题和解决方法。关注线程安全、反射攻击、序列化、生命周期和测试性,选择合适的实现方式以确保代码质量。了解单例模式的优缺点,谨慎使用,提升设计效率。
17 3
|
2天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
16 10
|
2天前
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
8 2
|
2天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
12 1
|
2天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
6 0
|
2天前
|
Java
Java的取余如何编写代码
【5月更文挑战第9天】Java的取余如何编写代码
19 5
|
2天前
|
设计模式 Java
【JAVA基础篇教学】第十四篇:Java中设计模式
【JAVA基础篇教学】第十四篇:Java中设计模式
|
1天前
|
Java
阅读《代码整洁之道》总结(1),java多线程面试
阅读《代码整洁之道》总结(1),java多线程面试