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

相关推荐
qqxhb7 小时前
26|Agent 设计模式:ReAct、Plan-and-Solve 与反射
设计模式·react模式·plan-and-solve·reflection模式
hssfscv8 小时前
软件设计师下午题六——Java的各种设计模式
java·算法·设计模式
zhaoshuzhaoshu10 小时前
设计模式之创建型设计模式详细解析(含示例)
单例模式·设计模式·架构
倚楼盼风雨11 小时前
浅析设计模式-23种设计模式剖析
设计模式
Momentary_SixthSense1 天前
设计模式之工厂模式
java·开发语言·设计模式
Java码农也是农1 天前
Multi-Agent 系统设计模式
设计模式·agent·multi-agent
sg_knight1 天前
设计模式实战:状态模式(State)
python·ui·设计模式·状态模式·state
workflower2 天前
深度学习是通用型人工智能的基础
人工智能·深度学习·设计模式·软件工程·软件构建·制造
Meme Buoy2 天前
11.3设计模式-新
设计模式
cmpxr_2 天前
【单片机】常用设计模式
单片机·嵌入式硬件·设计模式