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

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

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

目录
相关文章
|
2月前
|
设计模式 存储 Java
浅谈设计模式 - 备忘录模式(十五)
浅谈设计模式 - 备忘录模式(十五)
36 0
|
2月前
|
设计模式 存储
【设计模式系列笔记】备忘录模式
备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下捕获并恢复其内部状态。这种模式属于行为型设计模式。备忘录模式通常包含以下几个角色:发起人,备忘录,管理者。
37 0
|
2月前
|
设计模式 调度
【设计模式系列笔记】中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过将对象之间的直接通信转移到一个中介对象中,来减少对象之间的耦合度。这种模式被用来处理一个对象与其他对象之间的交互,使得各对象之间不需要直接相互了解。
30 0
|
2月前
|
设计模式 Java
【设计模式系列笔记】状态模式
在Java中,状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。状态模式的关键思想是将对象的状态封装成独立的类,并将对象的行为委托给当前状态的对象。这样,当对象的状态发生变化时,其行为也会相应地发生变化。
32 0
|
2月前
|
设计模式 消息中间件 存储
【设计模式系列笔记】观察者模式
观察者模式是一种设计模式,它允许一个对象(主题)维护一组依赖于它的对象(观察者)并在状态发生变化时通知它们。这种模式属于行为型模式。在观察者模式中,主题是被观察的对象,而观察者是依赖于主题的对象,当主题的状态发生变化时,所有注册的观察者都会得到通知并自动更新。
35 0
|
设计模式 安全 Java
深入浅出设计模式 - 责任链模式
深入浅出设计模式 - 责任链模式
9289 1
深入浅出设计模式 - 责任链模式
|
设计模式 存储 安全
深入浅出设计模式 - 备忘录模式
深入浅出设计模式 - 备忘录模式
98 1
深入浅出设计模式 - 备忘录模式
|
设计模式 安全 Java
深入浅出设计模式 - 观察者模式
深入浅出设计模式 - 观察者模式
81 1
深入浅出设计模式 - 观察者模式
|
设计模式 安全 Java
深入浅出设计模式 - 状态模式
深入浅出设计模式 - 状态模式
68 0
深入浅出设计模式 - 状态模式
|
设计模式 安全 Java
深入浅出设计模式 - 中介者模式
深入浅出设计模式 - 中介者模式
66 0
深入浅出设计模式 - 中介者模式