揭秘备忘录模式:打造灵活高效的状态管理解决方案

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。这种模式主要用于实现撤销操作。

在 Java 中,备忘录模式通常包括以下三个角色:

发起人(Originator):负责创建一个备忘录对象,用于存储其内部状态,并可以恢复之前的状态。
备忘录(Memento):负责存储发起人的内部状态。
管理者(Caretaker):负责保存和提供备忘录对象。
如下图:
在这里插入图片描述
以上的uml类图的示例代码:

// 发起人
public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void restoreStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 备忘录
public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

// 管理者
public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();

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

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

使用示例:

public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("状态1");
        System.out.println("当前状态: " + originator.getState());
        caretaker.addMemento(originator.saveStateToMemento());

        originator.setState("状态2");
        System.out.println("当前状态: " + originator.getState());
        caretaker.addMemento(originator.saveStateToMemento());

        originator.setState("状态3");
        System.out.println("当前状态: " + originator.getState());
        caretaker.addMemento(originator.saveStateToMemento());

        // 恢复到状态2
        originator.restoreStateFromMemento(caretaker.getMemento(1));
        System.out.println("恢复到状态2: " + originator.getState());
    }
}

以下是一些适用备忘录模式的场景:

  • 实现撤销操作:在文本编辑器如Word中,用户可能需要撤销之前的输入或删除操作,备忘录模式可以用来保存每一步的编辑状态,使得用户能够通过Ctrl + Z来撤销操作。
  • 实现对象的历史记录功能:在需要记录对象历史状态的应用中,如游戏中的存档功能,备忘录模式可以用来保存游戏进度,允许玩家在稍后的时间点加载之前的游戏状态。
  • 保护对象封装性:当需要保存和恢复对象的状态,但又不希望暴露对象的内部实现细节时,备忘录模式提供了一种方式,可以在不破坏对象封装性的前提下进行状态管理。

总的来说,备忘录模式提供了一种灵活的方式来管理对象的状态,它允许对象在不暴露内部实现的情况下,保存和恢复其状态,这在很多应用程序中都是非常有用的。

优点:

  • 封装性良好:备忘录模式将状态保存和恢复的逻辑封装在备忘录对象中,使得客户端无需了解对象的内部实现细节。
  • 可撤销操作:提供了一种可以恢复到之前状态的机制,这在需要支持撤销操作的场景中非常有用。
  • 性能开销小:由于备忘录模式只存储对象的状态,而不是整个对象,因此在空间和时间上的开销较小。

缺点:

  • 占用额外空间:每个备忘录都会占用额外的内存空间来存储状态信息,如果备忘录的数量很多,可能会占用大量内存。
  • 维护成本:当原发器的状态结构发生变化时,可能需要修改备忘录类的相关代码,增加了维护成本。
  • 使用限制:备忘录模式通常要求原发器类具有较为简单的内部状态,如果内部状态非常复杂或者难以序列化,那么使用备忘录模式可能会变得困难。

与其他模式的关系

备忘录模式通常与行为型模式中的其他模式结合使用,以实现更复杂的功能。以下是一些备忘录模式与其他设计模式的运用方式:

  1. 与命令模式(Command Pattern)结合:命令模式用于将操作封装为对象,这样可以根据需要存储、传递和执行这些操作。在实现撤销功能时,可以结合使用备忘录模式和命令模式。当执行一个命令时,可以先创建一个备忘录来保存当前状态,然后再执行命令。如果需要撤销,可以从备忘录中恢复状态。
  2. 与原型模式(Prototype Pattern)结合:原型模式用于通过复制现有的实例来创建新的实例,而不是通过调用构造函数。在需要保存和恢复状态的场景中,可以使用原型模式来创建备忘录对象,这样可以避免每次都重新初始化备忘录对象。
  3. 与访问者模式(Visitor Pattern)结合:访问者模式允许在不修改类结构的情况下添加新的操作。当需要对备忘录对象进行不同的操作时,可以使用访问者模式来实现这些操作,而不需要修改备忘录对象的内部结构。
  4. 与单例模式(Singleton Pattern)结合:单例模式确保一个类只有一个实例,并提供一个全局访问点。在备忘录模式中,管理者(Caretaker)角色可以使用单例模式来实现,以确保整个系统中只有一个管理者负责备忘录的保存和恢复。
  5. 与工厂方法模式(Factory Method Pattern)结合:工厂方法模式用于创建一个对象的接口,让子类决定实例化哪一个类。在创建备忘录对象时,可以使用工厂方法模式来生成不同类型的备忘录,以便根据不同的需求保存不同的状态信息。
  6. 与策略模式(Strategy Pattern)结合:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。在恢复备忘录的状态时,可以使用策略模式来选择不同的恢复策略,例如根据用户的偏好或者系统的性能要求来选择不同的恢复方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/370552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Java实现基于HTTP的分布式系统:让你的应用“四处开花”

在数字世界里&#xff0c;分布式系统就像是一个大家庭&#xff0c;每个成员&#xff08;即节点&#xff09;都有自己的任务和职责&#xff0c;共同维护整个家庭的运转。如果你想使用Java来实现这样一个大家庭&#xff0c;让应用在各个节点上“四处开花”&#xff0c;那就需要借…

设计模式1-访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许你定义在对象结构中的元素上进行操作的新操作&#xff0c;而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开&#xff0c;使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…

css1文本属性

一.颜色&#xff08;color&#xff09;&#xff08;一般用16进制&#xff09; 二.对齐&#xff08;text-align) 三.装饰&#xff08;text-decoration&#xff09; 四.缩进&#xff08;text-indent&#xff09;&#xff08;一般用2em&#xff09;&#xff08;有单位&#xff09;…

面试数据结构与算法总结分类+leetcode目录【基础版】

&#x1f9e1;&#x1f9e1;&#x1f9e1;算法题目总结&#xff1a; 这里为大家总结数据结构与算法的题库目录&#xff0c;如果已经解释过的题目会标注链接更新&#xff0c;方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的&#xff0c;同时这也是面试…

idea中找到所有的TODO

idea中找到所有的TODO &#xff08;1&#xff09;快捷键 Alt6 &#xff08;2&#xff09;View -> Tool Windows -> TODO

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

正则表达式可视化工具regex-vis

什么是正则表达式 &#xff1f; 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…

python 视频硬字幕去除 内嵌字幕去除工具vsr

项目简介 开源地址&#xff1a;https://github.com/YaoFANGUK/video-subtitle-remover Video-subtitle-remover (VSR) 是一款基于AI技术&#xff0c;将视频中的硬字幕去除的软件。 主要实现了以下功能&#xff1a; 无损分辨率将视频中的硬字幕去除&#xff0c;生成去除字幕后…

《学成在线》微服务实战项目实操笔记系列(P1~P49)【上】

《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。同时也欢迎大家提问与讨论&#xff0c;我会尽力帮大家解…

小华和小为的聚餐地点 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 小华和小为是很要好的朋友,他们约定周末一起吃饭。 通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达)。 求小华和小为都能到达的聚餐地点有多少个? 输入描述…

【小白开服日记】幻兽帕鲁服务器如何搭建?

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

代码编辑器1.9.0

多线程&#xff01;&#xff01;&#xff01; #include <winsock2.h> #include <windows.h> #include <iostream> #include <stdlib.h> #include <string.h> #include <fstream> #include <conio.h> #include <stdio.h> #incl…

Java并发(二十三)----同步模式之保护性暂停

1、定义 即 Guarded Suspension&#xff0c;用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程&#xff0c;让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线程那么可以使用消息队列 JDK 中&#xff0c;join 的实现…

嵌入式学习第十六天!(Linux文件查看、查找命令、标准IO)

Linux软件编程 1. Linux&#xff1a; 操作系统的内核&#xff1a; 1. 管理CPU 2. 管理内存 3. 管理硬件设备 4. 管理文件系统 5. 任务调度 2. Shell&#xff1a; 1. 保护Linux内核&#xff08;用户和Linux内核不直接操作&#xff0c;通过操作Shell&#xff0c;Shell和内核交互…

Ubuntu Linux 下安装和卸载cmake 3.28.2版本

一、安装cmake 1.首先&#xff0c;先从cmake官网下载cmake-3.28.2-linux-x86_64.tar.gz 2.用FinalShell 等文件上传工具&#xff0c;将这个压缩包上传到 虚拟机的某个路径去&#xff08;自选&#xff09; 3. cd /usr/local/bin/&#xff0c;然后创建cmake文件夹&#xff0c;…

重温《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 –– 学习笔记(二)

第二部分&#xff1a;自动内存管理机制 第2章&#xff1a;Java内存区域与内存溢出异常 2.1 概述 Java 与 C 之间有一堵由内存动态分配和垃圾收集技术围成的高墙。 Java 程序员在 虚拟机自动内存管理机制 的帮助下&#xff0c;无需为每一个 new 操作去写配对的 delete/free …

Cox等级资料是个坑

R语言做&#xff01;初学者先进来看看&#xff01;&#xff01;&#xff01; SCI冲 COX多因素模型需要满足的条件&#xff1a; 1.各观测值间相互独立&#xff0c;即残差之间不存在自相关&#xff1b; 2.因变量和自变量之间存在线性关系&#xff1b; 3.残差的方差齐&#xf…

鸿蒙ArkUI实现开关switch组件

鸿蒙ArkUI官方提供的toggle组件实现了开关的样式&#xff0c;但在使用过程中还是非常的不方便。 DIY可视化对鸿蒙ArkUI实现开关switch组件扩展后满足基本的switch需求&#xff0c;支持绑定值、设置标题文本、整个背景样式等。 /*** 开关*/ Component export default struct Di…

Angular BaseView抽离页面公用属性

前言 如果有一系列的页面布局很类似&#xff0c;为了节省时间&#xff0c;我们可以把这些类似的页面所通用的属性和方法抽离成一个BaseView&#xff0c;让其它页面继承该基础页面&#xff0c;同时将一些经常改变的属性和差异的属性写到配置文件里。例如树容器初始时是否展开、…

npm ERR! code CERT_HAS_EXPIRED

执行npm i报错&#xff1a; npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/react-redux failed, reason: connect ETIMEDOUT 104.16.2.35:443 npm ERR! network This is a problem rel…