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

相关推荐
范纹杉想快点毕业1 小时前
基于 C 语言视角:流程图中分支与循环结构的深度解析
c语言·stm32·单片机·设计模式·架构·流程图·uml
奈斯。zs12 小时前
java面向对象高级02——单例类(设计模式)
java·开发语言·设计模式
困鲲鲲12 小时前
设计模式:命令模式 Command
设计模式·命令模式
困鲲鲲17 小时前
设计模式:责任链模式 Chain of Responsibility
设计模式·责任链模式
LoveC52118 小时前
设计模式之外观模式
设计模式·外观模式
星眠18 小时前
手写发布订阅设计模式
javascript·设计模式·面试
源代码•宸19 小时前
深入浅出设计模式——创建型模式之单例模式 Singleton
开发语言·c++·经验分享·单例模式·设计模式
未既20 小时前
java设计模式 -【责任链模式】
java·设计模式·责任链模式
IT小白架构师之路1 天前
常用设计模式系列(十六)—策略模式
设计模式·bash·策略模式