Java设计模式之《备忘录模式》

目录

[1. 概念](#1. 概念)

1.1、定义

1.2、适用场景

2、角色划分

3、实现

1、Originator(发起人)

2、Memento(备忘录)

3、Caretaker(管理者)

4、使用示例

4、优缺点

4.1、优点

4.2、缺点


前言

备忘录模式是一种行为型设计模式,用于在不破坏封装性的情况下保存和恢复对象的状态。它包含源发器、备忘录和****管理者三个角色。

该模式常用于撤销操作,如文本编辑器的撤销功能和数据库事务管理。

备忘录模式虽然有内存占用和性能开销的缺点,但在需要状态管理的场景中十分有用。

设计模式分类如下:


1. 概念

1.1、定义

备忘录模式(Memento Pattern))用于在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在需要时恢复这个状态(如撤销操作)。

即允许对象把当前状态保存到外部对象中。以后可将其恢复。

1.2、适用场景

1、需要保存和恢复数据场景(如撤销、历史快照、存档、游戏进度、表单编辑器等)。

2、不希望外部对象随意访问对象内部细节,但需要保存和恢复快照。


2、角色划分

如下图所示:

  • Originator(发起人/原发器):拥有内部状态,需要保存和恢复
  • Memento(备忘录):保存Originator的状态
  • Caretaker(管理者/看护者):保存并管理备忘录,但不能操作备忘录内部实现内容

3、实现

1、Originator(发起人)

java 复制代码
class Editor {
    private String text;
    public void setText(String text) { this.text = text; }
    public String getText() { return text; }
    public Memento save() { return new Memento(text); }
    public void restore(Memento m) { this.text = m.getText(); }
}

2、Memento(备忘录)

java 复制代码
class Memento {
    private final String text;
    public Memento(String text) { this.text = text; }
    public String getText() { return text; }
}

3、Caretaker(管理者)

java 复制代码
import java.util.Stack;
class Caretaker {
    private Stack<Memento> history = new Stack<>();
    public void add(Memento m) { history.push(m); }
    public Memento undo() {
        if (!history.isEmpty()) return history.pop();
        return null;
    }
}

4、使用示例

java 复制代码
public class Main {
    public static void main(String[] args) {
        Editor editor = new Editor();
        Caretaker caretaker = new Caretaker();

        editor.setText("第一版");
        caretaker.add(editor.save());
        editor.setText("第二版");
        caretaker.add(editor.save());
        editor.setText("第三版");

        // 撤销到第二版
        editor.restore(caretaker.undo());
        System.out.println(editor.getText()); // 输出 第二版
        // 再撤销
        editor.restore(caretaker.undo());
        System.out.println(editor.getText()); // 输出 第一版
    }
}

4、优缺点

4.1、优点

1、状态保存与恢复:

备忘录模式可以帮助我们保存对象的状态,并在需要时恢复到之前的状态。这在某些情况下非常有用,比如撤销操作或者程序崩溃后的恢复。

2、封装性和隔离性:

可以确保对象的状态保存在备忘录对象中,而不会暴露给其他对象。这为对象的封装性和隔离性提供了保护,使得对象的状态变化对其他对象是透明的。

4.2、缺点

1、内存占用:

可能引起较大的内存占用,特别是当对象的状态较多且状态改变频繁时。每个备忘录对象都需要保存一份完整的状态,如果状态较多或者备忘录对象较多,可能会消耗大量内存。

2、性能开销:

备忘录模式涉及到创建、存储和恢复状态的操作,这些操作可能引起一定的性能开销。特别是在状态较大或者对象较复杂的情况下,备忘录模式的性能可能会受到影响。


总结:


参考文章:

1、设计模式(十九)行为型:备忘录模式详解-CSDN博客文章浏览阅读443次,点赞19次,收藏21次。备忘录模式(Memento Pattern)是 GoF 23 种设计模式中的行为型模式之一,其核心价值在于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在之后能够将该对象恢复到原先保存的状态。https://blog.csdn.net/ZxqSoftWare/article/details/149712206?ops_request_misc=%257B%2522request%255Fid%2522%253A%252299945c753ba5cd13ba1abf9c2213f646%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=99945c753ba5cd13ba1abf9c2213f646&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-149712206-null-null.142^v102^control&utm_term=%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

相关推荐
牛奶咖啡133 小时前
学习设计模式《二十三》——桥接模式
学习·设计模式·桥接模式·认识桥接模式·桥接模式的优点·何时选用桥接模式·桥接模式的使用示例
左灯右行的爱情3 小时前
深度学习设计模式:责任链(Chain of Responsibility)模式(例子+业务场景+八股)
深度学习·设计模式·责任链模式
是2的10次方啊3 小时前
🚀 Spring设计模式大揭秘:23种模式藏在你每天在用的框架里
设计模式
东北南西3 小时前
设计模式-单例模式
前端·javascript·单例模式·设计模式
快乐非自愿5 小时前
掌握设计模式--命令模式
设计模式·命令模式
我希望的一路生花14 小时前
Nik Collection 6.2全新版Nik降噪锐化调色PS/LR插件
人工智能·计算机视觉·设计模式·stable diffusion·aigc
东北南西19 小时前
设计模式-工厂模式
前端·设计模式
JohnYan20 小时前
工作笔记 - 改进的单例应用
javascript·设计模式·bun
郝学胜-神的一滴1 天前
使用C++11改进工厂方法模式:支持运行时配置的增强实现
开发语言·c++·程序人生·设计模式
Leo来编程1 天前
设计模式3-模板方法模式
设计模式·模板方法模式