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 的状态可以在不违反封装原则的情况下被保存和恢复。

相关文章
|
3天前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
21 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
3天前
|
存储 Java 数据安全/隐私保护
Java中的域,什么是域?计算机语言中的域是什么?(有代码实例)
文章解释了Java中域的概念,包括实例域、静态域、常量域和局部域,以及它们的特点和使用场景。
10 2
|
2天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
21 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3天前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
14 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
3天前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
23 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
22小时前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
8 0
|
22小时前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
8 0
|
22小时前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
8 0
|
3天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
6 0
|
3天前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
9 0