JAVA设计模式22:备忘录模式,用于保存和恢复对象的状态

2023-11-08 10:13:23 浏览数 (2)

作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。


一、什么是备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下保存和恢复对象的状态

备忘录模式通过将对象的状态封装在备忘录对象中,使得可以在需要时将对象恢复到之前的某个状态。

在备忘录模式中,有

3

个关键角色,请同学们认真学习。

  1. 发起人(Originator):负责创建一个备忘录对象,用于保存自身的状态,并可以通过备忘录对象恢复到之前的状态。
  2. 备忘录(Memento):用于存储发起人对象的内部状态,并提供给发起人对象访问其状态的接口。
  3. 管理者(Caretaker):负责保存备忘录对象,但不能对备忘录对象进行操作或检查其内容。

备忘录模式的工作原理如下,请同学们认真学习。

  1. 发起人创建备忘录对象,并将自身的状态保存到备忘录对象中。
  2. 发起人可以根据需要从备忘录对象中恢复自身的状态。
  3. 管理者负责保存备忘录对象,但不能对备忘录对象进行操作或检查其内容。

备忘录模式的应用场景包括以下

3

种。

  1. 需要实现对象的撤销操作。
  2. 需要实现对象的历史记录功能。
  3. 需要保存和恢复对象的状态,但又不希望暴露对象内部状态给其他对象。

备忘录模式提供了一种在不破坏封装性的前提下保存和恢复对象状态的方式,使得对象可以在需要时回滚到之前的某个状态。它可以有效地解决状态管理和历史记录的问题。


二、备忘录模式实例

下面是一个简单的 Java 代码示例,演示了备忘录模式的实现,请同学们复制到本地执行。

代码语言:javascript复制
// 备忘录类
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 restoreStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 管理者类
class Caretaker {
    private Memento memento;

    public void saveMemento(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }
}

// 示例代码
public class MementoPatternExample {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 发起人设置初始状态
        originator.setState("State 1");
        System.out.println("当前状态: "   originator.getState());

        // 管理者保存备忘录
        caretaker.saveMemento(originator.saveStateToMemento());

        // 发起人修改状态
        originator.setState("State 2");
        System.out.println("当前状态: "   originator.getState());

        // 恢复到之前的状态
        originator.restoreStateFromMemento(caretaker.getMemento());
        System.out.println("恢复后的状态: "   originator.getState());
    }
}

在上面的示例中,Originator类是发起人,它可以设置和获取当前状态,并且可以将当前状态保存到备忘录中,或者从备忘录中恢复状态。

Memento类是备忘录,它存储了 Originator 的状态,Caretaker 类是管理者,负责保存备忘录对象。

在示例代码中,我们创建了一个 Originator 对象,并设置了初始状态为 State 1

然后,我们创建了一个备忘录并保存了 Originator 的状态。接下来,我们修改了 Originator 的状态为 State 2

最后,我们使用 Caretaker 从备忘录中恢复了 Originator 的状态,并打印出恢复后的状态。

运行上述代码将输出,结果如下。

代码语言:javascript复制
当前状态: State 1
当前状态: State 2
恢复后的状态: State 1

这个示例展示了备忘录模式的基本使用方式,即通过备忘录对象保存和恢复发起人对象的状态。


三、备忘录模式的应用场景

备忘录模式有以下

5

个常见应用场景,请同学们认真学习。

  1. 撤销操作:备忘录模式可以用于实现撤销操作。通过保存对象的状态到备忘录中,并在需要时将对象恢复到之前的状态,实现撤销操作的功能。
  2. 历史记录功能:备忘录模式可以用于实现对象的历史记录功能。通过保存对象的不同状态到备忘录中,可以记录对象的历史状态,并在需要时进行查看和回溯。
  3. 编辑器或文档恢复:备忘录模式在编辑器或文档编辑器中可以用于实现恢复功能。通过保存文档或编辑器的状态到备忘录中,可以在出现错误或意外关闭时恢复到之前的状态。
  4. 游戏中的存档与恢复:备忘录模式可以用于游戏中的存档与恢复功能。通过保存游戏角色的状态到备忘录中,可以在游戏进行中进行存档,并在需要时恢复到之前的状态。
  5. 事务管理:备忘录模式可以用于实现事务管理。通过保存对象的状态到备忘录中,在事务执行失败时可以将对象恢复到之前的状态,保证事务的一致性和完整性。

总之,备忘录模式适用于需要保存和恢复对象状态的场景,尤其是在需要实现撤销操作、历史记录、恢复功能等方面,它可以有效地解决状态管理和历史记录的问题,并提供更好的灵活性和可维护性。


四、备忘录模式面试题

一、请解释备忘录模式的定义和用途。

答案:备忘录模式是一种行为型设计模式,它允许在不暴露对象内部状态的情况下保存和恢复对象的状态。备忘录模式通过将对象的状态封装在备忘录对象中,使得可以在需要时将对象恢复到之前的某个状态。它的主要用途是实现撤销操作、历史记录、恢复功能等,提供更好的灵活性和可维护性。

二、备忘录模式中有哪些关键角色?

答案:备忘录模式中有三个关键角色:

  1. 发起人(Originator):负责创建一个备忘录对象,用于保存自身的状态,并可以通过备忘录对象恢复到之前的状态。
  2. 备忘录(Memento):用于存储发起人对象的内部状态,并提供给发起人对象访问其状态的接口。
  3. 管理者(Caretaker):负责保存备忘录对象,但不能对备忘录对象进行操作或检查其内容。

三、备忘录模式适用于哪些场景?

答案:备忘录模式适用于以下场景:

  1. 需要实现对象的撤销操作。
  2. 需要实现对象的历史记录功能。
  3. 需要保存和恢复对象的状态,但又不希望暴露对象内部状态给其他对象。
  4. 需要实现事务管理,保证事务的一致性和完整性。
  5. 需要提供编辑器或文档的恢复功能。

四、在备忘录模式中,发起人和备忘录之间如何通信?

答案:在备忘录模式中,发起人和备忘录之间通常使用备忘录对象作为中介来进行通信。发起人通过调用备忘录对象的方法来保存当前状态或从备忘录对象中恢复状态。备忘录对象保存了发起人对象的内部状态,并提供给发起人对象访问其状态的接口。

五、备忘录模式和原型模式有什么区别?

答案:备忘录模式和原型模式虽然都涉及对象状态的保存和恢复,但两者的主要区别在于:

  1. 备忘录模式关注于对象状态的保存和恢复,它通过备忘录对象来实现。
  2. 原型模式关注于对象的复制和创建,它通过原型对象来实现。

备忘录模式的重点是在不暴露对象内部状态的情况下保存和恢复状态,而原型模式的重点是通过复制现有对象来创建新对象。

0 人点赞