津津乐道设计模式 - 备忘录模式详解(让你知道文本编辑器是如何还原历史操作内容)

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

什么是备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它用于在不破坏对象封装性的前提下,捕获对象的内部状态并在对象之外保存这些状态,以便在将来可以将对象恢复到之前的状态。

备忘录模式的核心思想是将对象的状态保存到备忘录对象中,然后可以将备忘录对象保存在一个管理者(或称为负责人)对象中,这样可以在需要的时候将对象恢复到之前的状态。

备忘录模式类图

备忘录模式的类图包含三个主要角色:Originator(原发器)、Memento(备忘录)和Caretaker(负责人)

下面是备忘录模式的类图:
在这里插入图片描述

  • Originator(原发器):负责创建备忘录对象,并记录当前状态到备忘录对象中。同时,它也可以从备忘录对象中恢复之前保存的状态。

  • Memento(备忘录):用于存储 Originator 对象的内部状态,并提供获取状态和设置状态的方法。

  • Caretaker(负责人):负责管理备忘录对象,可以存储多个备忘录对象,用于保存

备忘录模式适用场景

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

  • 需要保存和恢复对象的状态:当需要保存对象的状态,以便在之后的某个时间点将对象恢复到之前的状态时,可以使用备忘录模式

  • 需要实现撤销和恢复功能:备忘录模式可以实现撤销和恢复功能,当用户需要撤销某个操作时,可以将对象恢复到之前的状态

  • 需要保护对象的封装性:备忘录模式可以在不破坏对象的封装性的前提下,保存对象的内部状态

  • 需要对对象的历史状态进行管理:备忘录模式可以将对象的历史状态保存在管理者对象中,可以方便地管理多个备忘录对象

备忘录模式适用于需要保存和恢复对象的状态,实现撤销和恢复功能,以及保护对象的封装性的场景。它可以帮助我们在不破坏对象封装性的前提下,实现对对象状态的管理和恢复。

现实生活案例

假设你正在使用一个文本编辑器,在编辑一份重要的文件时,突然遇到了计算机系统崩溃的情况。你担心之前编辑的内容会丢失,因此希望能够恢复到之前的编辑状态。这时,备忘录模式可以派上用场。
在这里插入图片描述

在这个生活案例中,你可以将文本编辑器视为 Originator,它负责创建备忘录对象并保存当前的编辑状态;文本编辑器的编辑内容可以看作 Originator 的状态。而备忘录对象则是 Memento,用于保存编辑器的状态快照。你可以将备忘录对象保存在一个备忘录管理器中,作为 Caretaker,以便在需要的时候可以方便地恢复到之前的编辑状态。

根据上述案例用java代码模拟:

首先,我们定义 Memento 类来保存编辑器的状态:

// Memento 类用于保存编辑器的状态
public class Memento {
    private final String content;

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

    public String getContent() {
        return content;
    }
}

然后,我们定义 TextEditor 类作为 Originator,负责创建备忘录对象并保存当前的编辑状态:

// TextEditor 类作为 Originator,负责创建备忘录对象并保存当前的编辑状态
public class TextEditor {
    private String content;

    public void write(String content) {
        this.content = content;
    }

    public Memento save() {
        return new Memento(content);
    }

    public void restore(Memento memento) {
        this.content = memento.getContent();
    }

    public String getContent() {
        return content;
    }
}

接下来,我们定义 TextEditorHistory 类作为 Caretaker,负责管理备忘录对象:

// TextEditorHistory 类作为 Caretaker,负责管理备忘录对象
import java.util.Stack;

public class TextEditorHistory {
    private Stack<Memento> history = new Stack<>();

    public void save(Memento memento) {
        history.push(memento);
    }

    public Memento undo() {
        if (!history.isEmpty()) {
            return history.pop();
        }
        return null;
    }
}

最后,我们来进行测试:

public class MementoPatternTest {
    public static void main(String[] args) {
        TextEditor textEditor = new TextEditor();
        TextEditorHistory history = new TextEditorHistory();

        // 编辑文本
        textEditor.write("这是初始文本内容");
        System.out.println("当前编辑内容:" + textEditor.getContent());

        // 保存当前状态到备忘录中
        history.save(textEditor.save());

        // 继续编辑文本
        textEditor.write("使用备忘录模式编辑");
        System.out.println("当前编辑内容:" + textEditor.getContent());

        // 恢复到之前的状态
        Memento previousState = history.undo();
        if (previousState != null) {
            textEditor.restore(previousState);
            System.out.println("恢复后的编辑内容:" + textEditor.getContent());
        } else {
            System.out.println("无可恢复的状态。");
        }
    }
}

最终运行效果:
在这里插入图片描述
在上述代码中,我们创建了一个文本编辑器 TextEditor,可以通过 write 方法来编辑文本内容,通过 save 方法将当前状态保存到备忘录中,通过 restore 方法将编辑器恢复到之前的状态。我们还创建了 TextEditorHistory 类来管理备忘录对象,可以通过 saveundo 方法来保存状态和撤销状态。

结语

本章节主要介绍了备忘录模式、备忘录模式适用场景、以日常使用的文本编辑器来演示备忘录模式,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出更多优质的博文与大家一起分享交流~
原创不易转载请注明出处:CSND - Micro麦可乐的博客 https://blog.csdn.net/lhmyy521125

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micro麦可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值