当前位置: 首页 > article >正文

【玩转23种Java设计模式】行为型模式篇:备忘录模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录

  • 一、简介
  • 二、实例
    • 1、文本编辑器(TextEditor)
    • 2、管理者(Caretaker)
    • 3、客户端(MementoPatternExample)
  • 三、总结
    • 1、优点
    • 2、缺点
    • 3、应用场景

一、简介

  备忘录模式(Memento Pattern)是一种行为型设计模式,用于保存对象的状态,以便在未来可以恢复到之前的某个状态。该模式避免了直接暴露对象的内部状态,从而实现了数据的封装性。

主要角色:

  • Originator(发起人):创建并存储自身状态到备忘录中,可以从备忘录中恢复状态。
  • Memento(备忘录):存储发起人的状态,提供给发起人恢复状态的接口。
  • Caretaker(管理者):负责保存和管理备忘录,但不能操作备忘录内容。

二、实例

例如:模拟文本编辑器中“撤销”操作的实现。

1、文本编辑器(TextEditor)

class TextEditor {
    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 memento) {
        this.text = memento.getText();
    }

    // Memento:备忘录内部类
    static class Memento {
        private final String text;

        private Memento(String text) {
            this.text = text;
        }

        private String getText() {
            return text;
        }
    }
}

2、管理者(Caretaker)

class Caretaker {
    private final List<TextEditor.Memento> mementoList = new ArrayList<>();

    public void addMemento(TextEditor.Memento memento) {
        mementoList.add(memento);
    }

    public TextEditor.Memento getMemento(int index) {
        return mementoList.get(index);
    }
}

3、客户端(MementoPatternExample)

public class MementoPatternExample {
    public static void main(String[] args) {
        TextEditor editor = new TextEditor();
        Caretaker caretaker = new Caretaker();

        // 初始状态
        editor.setText("Hello");
        System.out.println("Initial Text: " + editor.getText());
        caretaker.addMemento(editor.save());

        // 修改状态1
        editor.setText("Hello, World");
        System.out.println("Updated Text: " + editor.getText());
        caretaker.addMemento(editor.save());

        // 修改状态2
        editor.setText("Hello, Design Patterns");
        System.out.println("Updated Text: " + editor.getText());
        caretaker.addMemento(editor.save());

        // 撤销操作
        editor.restore(caretaker.getMemento(1));
        System.out.println("After Undo: " + editor.getText());

        // 再次撤销
        editor.restore(caretaker.getMemento(0));
        System.out.println("After Second Undo: " + editor.getText());
    }
}

三、总结

1、优点

  • 封装性好:发起人和备忘录内部状态的实现细节对外界透明,保证了对象的封装性。
  • 状态恢复:可以轻松保存和恢复对象的状态,适合需要频繁回退操作的场景。
  • 灵活性高:支持保存多个状态,提供多种恢复方式。

2、缺点

  • 资源消耗大:如果状态对象较大或需要保存的状态很多,可能会消耗较多内存。
  • 管理复杂:需要一个管理机制来保存和恢复状态,增加了系统复杂性。

3、应用场景

  • 撤销和重做功能:如文本编辑器、图形编辑器。
  • 游戏存档:在游戏中保存和恢复玩家的进度。
  • 事务性操作:在操作失败时可以回滚到之前的状态。
  • 状态恢复:适用于需要频繁切换对象状态的场景。

http://www.kler.cn/a/460916.html

相关文章:

  • mamba-ssm安装
  • AngularJS 过滤器:提升用户体验的数据处理利器
  • k8s系列--docker拉取镜像导入k8s的containerd中
  • Spark Runtime Filter
  • 微信小程序 覆盖组件cover-view
  • 批量读取pdf发票中二维码的信息
  • 26. 机器人走迷宫
  • 条款42:了解 typename 的双重含义(Understand the two meanings of typename)
  • 条款43:学习处理模板化基类内的名称(Know how to access names in templatized base classes)
  • Java中如何实现线程安全的单例模式?
  • raspberrypi-kernel
  • Ps:将数据组作为文件导出
  • RabbitMQ实现生产者消费者
  • 使用react和redux构建一个简单的计数器
  • RP2040 C SDK I2C外设使用
  • Docker容器镜像制作
  • 正则表达式介绍和python中的简单使用
  • 大中厂面试经验分享:如何使用消息队列(MQ)解决系统问题
  • 科技风杂志科技风杂志社科技风编辑部2024年第36期目录
  • 【优选算法】有效三角形的个数
  • SpringBoot集成ECDH密钥交换
  • Linux C/C++编程-网络程序架构与套接字类型
  • 【Java 新特性】深入浅出 Java Lambda 表达式
  • vim里搜索关键字
  • 【Windows】Windows系统查看目录中子目录占用空间大小
  • YK人工智能(二)——万字长文了解深度学习环境配置