深入浅出设计模式 - 备忘录模式

简介: 深入浅出设计模式 - 备忘录模式

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

1687956032083.jpg

1、什么是备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。备忘录模式通过在对象中创建一个备忘录对象,用于保存对象的状态,并在需要时将对象恢复到之前的状态。

备忘录模式的核心思想是将对象的状态封装到备忘录对象中,通过将备忘录对象保存在一个管理者对象中,实现对对象状态的保存和恢复。这样可以实现对象状态的撤销、重做、历史记录等功能。

2、备忘录模式的优缺点

备忘录模式的优点包括:

  1. 备忘录模式可以实现对象状态的保存和恢复,使得对象的状态变化具有可追溯性,可以方便地进行撤销和重做操作。

  2. 备忘录模式可以将对象的状态封装在备忘录对象中,从而保持了对象的封装性,不会暴露内部状态给外部对象。

  3. 备忘录模式可以在不破坏对象封装性的前提下,捕获和保存对象的内部状态,使得对象可以在不同的时间点恢复到之前的状态。

备忘录模式的缺点包括:

  1. 如果需要保存的对象状态较多或者状态变化频繁,备忘录模式会消耗较多的内存资源。

  2. 如果需要保存的对象状态较复杂,备忘录模式可能会增加代码的复杂性和维护成本。

  3. 如果对象的状态需要保密或者访问权限受限,备忘录模式可能会破坏对象的封装性。

总体来说,备忘录模式适用于需要保存和恢复对象状态的场景,特别是在需要实现撤销、重做、历史记录等功能时。但是在使用时需要权衡内存消耗和代码复杂性。

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

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

  1. 需要保存和恢复对象状态的情况:当需要保存对象的某个状态,并在需要时将对象恢复到该状态时,可以使用备忘录模式。例如,文本编辑器中的撤销和重做功能,可以使用备忘录模式来保存文本的不同版本状态。

  2. 需要实现撤销、重做或者历史记录功能的情况:备忘录模式可以用于实现撤销、重做或者历史记录功能。例如,图形绘制软件中的撤销和重做功能,可以使用备忘录模式来保存不同绘制步骤的状态,以便在需要时进行恢复。

  3. 需要实现对象状态的快照功能的情况:备忘录模式可以用于实现对象状态的快照功能,即在某个时间点保存对象的状态,并在需要时恢复到该状态。例如,游戏中的存档功能,可以使用备忘录模式来保存游戏进度的快照。

  4. 需要实现多级撤销功能的情况:备忘录模式可以支持多级撤销功能,即可以保存多个状态,并按照一定的顺序进行恢复。例如,文档编辑软件中的多级撤销功能,可以使用备忘录模式来保存多个编辑操作的状态,并按照操作的顺序进行恢复。

总之,备忘录模式适用于需要保存和恢复对象状态、实现撤销、重做、历史记录等功能的场景。它可以提高代码的可维护性和灵活性,同时保持对象的封装性。

4、备忘录模式的结构

备忘录模式的结构包括以下几个角色:

  1. 发起人(Originator):负责创建备忘录对象,并可以使用备忘录对象来保存和恢复自身的状态。

  2. 备忘录(Memento):用于保存发起人对象的状态,可以包含发起人的部分或全部状态信息。

  3. 管理者(Caretaker):负责保存和管理备忘录对象,可以根据需要保存多个备忘录对象,并在需要时将其提供给发起人进行状态的恢复。

备忘录模式的基本流程如下:

  1. 发起人创建备忘录对象,并将自身的状态保存到备忘录对象中。

  2. 发起人将备忘录对象交给管理者进行管理,管理者可以保存多个备忘录对象。

  3. 在需要时,发起人可以从管理者那里获取备忘录对象,并使用备忘录对象来恢复自身的状态。

备忘录模式的结构图如下所示:

|   Originator    |
  +-----------------+
          |
          | createMemento()
          |
  +-----------------+
  |    Memento      |
  +-----------------+
          |
          | getState()
          +-----------------+
          | setState()     |
  +-----------------+     |
  |   Caretaker     |     |
  +-----------------+     |
          |               |
          | addMemento()  |
          |               |
          +---------------+

在这个结构中,发起人(Originator)通过调用createMemento()方法创建备忘录对象,并将自身的状态保存到备忘录对象中。备忘录对象(Memento)可以通过getState()方法获取发起人的状态,也可以通过setState()方法设置发起人的状态。管理者(Caretaker)负责保存和管理备忘录对象,可以通过addMemento()方法将备忘录对象添加到管理者中,并在需要时提供给发起人进行状态的恢复。

5、备忘录模式的原理

备忘录模式的原理是通过将对象的状态保存到备忘录对象中,以便在需要时可以将对象恢复到之前的状态。

具体原理如下:

  1. 发起人(Originator):发起人是需要保存状态的对象。当发起人需要保存当前状态时,会创建一个备忘录对象,并将自身的状态保存到备忘录对象中。

  2. 备忘录(Memento):备忘录对象用于保存发起人的状态。它可以包含发起人的部分或全部状态信息,但是对外部是不可见的,只有发起人能够访问备忘录对象的状态。

  3. 管理者(Caretaker):管理者负责保存和管理备忘录对象。它可以保存多个备忘录对象,可以根据需要进行备忘录的存储和提供。

  4. 客户端(Client):客户端通过与发起人和管理者进行交互来实现状态的保存和恢复。客户端可以通过发起人创建备忘录对象,并将备忘录对象交给管理者进行管理。在需要恢复状态时,客户端可以从管理者那里获取备忘录对象,并将其传递给发起人进行状态的恢复。

备忘录模式的核心思想是将对象的状态保存到备忘录对象中,从而实现状态的保存和恢复。这样可以使得对象在不破坏封装性的前提下,可以方便地保存和恢复状态,提高代码的可维护性和灵活性。

6、备忘录模式的代码案例

package com.pany.camp.design.principle.memorandum;

/**
 *
 * @description:  发起人
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-28 20:46
 */
public class Originator {
   
   

    private String state;

    public void setState(String state) {
   
   
        this.state = state;
    }

    public String getState() {
   
   
        return state;
    }

    public Memento createMemento() {
   
   
        return new Memento(state);
    }

    public void restoreMemento(Memento memento) {
   
   
        this.state = memento.getState();
    }
}
package com.pany.camp.design.principle.memorandum;

/**
 *
 * @description:  备忘录类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 20:46
 */
public class Memento {
   
   

    private String state;

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

    public String getState() {
   
   
        return state;
    }
}
package com.pany.camp.design.principle.memorandum;

/**
 *
 * @description: 管理者类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 20:46
 */
public class Caretaker {
   
   

    private Memento memento;

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

    public Memento getMemento() {
   
   
        return memento;
    }
}
package com.pany.camp.design.principle.memorandum;

/**
 *
 * @description:  客户端类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 20:47
 */
public class Client {
   
   

    public static void main(String[] args) {
   
   
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 设置初始状态
        originator.setState("State 1");
        System.out.println("初始状态:" + originator.getState());

        // 创建备忘录并保存状态
        caretaker.setMemento(originator.createMemento());

        // 修改状态
        originator.setState("State 2");
        System.out.println("修改后的状态:" + originator.getState());

        // 恢复状态
        originator.restoreMemento(caretaker.getMemento());
        System.out.println("恢复后的状态:" + originator.getState());
    }
}

Originator类是发起人,负责保存和恢复状态。Memento类是备忘录,用于保存状态。Caretaker类是管理者,负责保存和管理备忘录。Client类是客户端,用于测试备忘录模式的使用。

运行以上代码,输出结果如下:

初始状态:State 1
修改后的状态:State 2
恢复后的状态:State 1

Process finished with exit code 0

1686494501743.jpg

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊

1687869804912.jpg

目录
相关文章
|
6月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
87 0
|
6月前
|
设计模式 存储 Java
【设计模式】备忘录模式
【设计模式】备忘录模式
|
6月前
|
设计模式 存储 Java
浅谈设计模式 - 备忘录模式(十五)
浅谈设计模式 - 备忘录模式(十五)
47 0
|
6月前
|
设计模式 存储 Java
Java设计模式【十九】:备忘录模式
Java设计模式【十九】:备忘录模式
40 0
|
2月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
3月前
|
设计模式 算法
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
|
5月前
|
设计模式
备忘录模式-大话设计模式
备忘录模式-大话设计模式
|
4月前
|
设计模式 数据处理
iLogtail设计模式问题之什么是备忘录模式
iLogtail设计模式问题之什么是备忘录模式
|
5月前
|
设计模式 存储 Java
Java设计模式之备忘录模式详解
Java设计模式之备忘录模式详解
|
6月前
|
存储 设计模式 安全
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
备忘录模式是一种行为设计模式,允许在不破坏对象封装性的情况下保存和恢复对象的内部状态。该模式通过创建备忘录对象来存储发起人的状态信息,发起人可根据需要创建和恢复备忘录。管理者则负责保存和管理备忘录,但无法访问其内容。备忘录模式简化了状态管理,支持撤销操作和历史记录功能,提高了系统的灵活性和可用性。在实际应用中,备忘录模式常用于文本编辑器、游戏和数据库事务处理等场景,确保对象状态的安全恢复和有效管理。通过备忘录模式,开发人员可以更好地控制对象状态的变化,提升软件系统的健壮性和用户体验。
131 1
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
下一篇
无影云桌面