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

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

博主介绍: ✌博主从事应用安全和大数据领域,有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

💕💕 本文由激流原创,原创不易,感谢支持
💕💕喜欢的话记得点赞收藏啊

1687869804912.jpg

目录
相关文章
|
4月前
|
设计模式 存储 算法
|
5月前
|
设计模式 算法
什么是设计模式,有哪些设计模式,设计模式用来做什么
什么是设计模式,有哪些设计模式,设计模式用来做什么
|
5月前
|
设计模式 存储 安全
[设计模式] 常见的设计模式
[设计模式] 常见的设计模式
|
12月前
|
设计模式 安全 Java
设计模式之单列模式
设计模式之单列模式
53 0
|
设计模式 算法 程序员
【3W2H设计模式】什么是设计模式
【3W2H设计模式】什么是设计模式
255 0
|
设计模式 存储 NoSQL
为什么我们需要设计模式?
设计模式解决什么问题设计模式一直被认为是一门难以学习的课程。究其原因是因为我们不清楚设计模式在解决哪些问题方面发挥作用。简言之,设计是为了实现特定的目标,基于不断更新的局部知识来获得解决方案的过程。我们通常熟悉的范式是在几乎掌握所有知识的情况下解决问题,例如解数学题、物理题等。然而,在软件编程过程中,我们掌握的知识往往不充分,而且会不断更新,因此需要我们关注有哪些知识,没有哪些知识,可以获取哪些知
9323 1
|
设计模式 算法 数据库连接
|
设计模式 消息中间件 Java
一起来学设计模式之认识设计模式
前言 目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本节给大家讲一下设计模式基本概念,它的基本原则以及有哪些设计模式~ 本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~ 设计模式初识 设计模式是一种经过验证的、被广泛应用的解决特定问题的软件设计方案,它提供了一种在软件设计中反复使用的解决方案。设计模式通常描述了一个问题的情境、解决方案和解决方案的优点和缺点。设计模式不是一种具体的编程语言特性或库,而是一种通用的设计思想和方法。
|
设计模式 存储 算法
【设计模式】常用的10种设计模式
收录一些自己在开发过程中比较常用的模式,整理出来以便自己梳理和复习,从而熟能生巧,举一反三。下面只列出模式的脉络大纲,取最核心的逻辑进行讲解。
105 0
【设计模式】常用的10种设计模式
|
设计模式 数据可视化 程序员
设计模式(一)
设计模式
117 0