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

备忘录模式(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());// 恢复到状态2originator.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)结合:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。在恢复备忘录的状态时,可以使用策略模式来选择不同的恢复策略,例如根据用户的偏好或者系统的性能要求来选择不同的恢复方式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3:25—其他API

目录 1、shallowRef和shallowReactive 2、readonly与shallowReadonly readonly shallowReadonly 3、toRaw和markRaw toRaw markRaw 4、customRef 1、shallowRef和shallowReactive shallowRef 1.作用:创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。2…

Windows 安装 MySQL 最新最简教程

Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…

JUnit实践教程——Java的单元测试框架

前言 大家好&#xff0c;我是chowley&#xff0c;最近在学单元测试框架——JUnit&#xff0c;写个博客记录一下&#xff01; 在软件开发中&#xff0c;单元测试是确保代码质量和稳定性的重要手段之一。JUnit作为Java领域最流行的单元测试框架&#xff0c;为开发人员提供了简单…

(2)(2.14) SPL Satellite Telemetry

文章目录 前言 1 本地 Wi-Fi&#xff08;费用&#xff1a;30 美元以上&#xff0c;范围&#xff1a;室内&#xff09; 2 蜂窝电话&#xff08;费用&#xff1a;100 美元以上&#xff0c;范围&#xff1a;蜂窝电话覆盖区域&#xff09; 3 手机卫星&#xff08;费用&#xff…

IT行业顶级证书:助力职业生涯的制胜法宝

IT行业顶级证书&#xff1a;助力职业生涯的制胜法宝 在IT行业&#xff0c;拥有一系列高含金量的证书是事关职业生涯发展的关键。这些证书不仅是技能的象征&#xff0c;更是在激烈的市场竞争中脱颖而出的法宝。让我们一起揭晓在中国IT行业中&#xff0c;哪些证书是最具含金量的…

仰暮计划|“​爷爷说这些话的时候眼睛都红着,他那变形的脊柱和瘸拐的双腿都证明他曾为这个家付出了血汗拼尽了全力”

赴一场拾光之旅&#xff0c;集往年回忆碎片 爷爷生于1952年&#xff0c;今年已有七十一了&#xff0c;是河南焦作沁阳北金村的一位地道农民&#xff0c;劳苦一生&#xff0c;如今终于得以颐养天年。许是早年经历过于难忘&#xff0c;爷爷如今与我讲起仍是记忆犹新&#xff0c;…

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现手动复现小龙验证Goby验证 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工…

uniapp 本地存储的方式

1. uniapp 本地存储的方式 在uniapp开发中&#xff0c;本地存储是一个常见的需求。本地存储可以帮助我们在客户端保存和管理数据&#xff0c;以便在应用程序中进行持久化存储。本文将介绍uniapp中本地存储的几种方式&#xff0c;以及相关的代码示例。 1.1. 介绍 在移动应用开发…

瑞_力扣LeetCode_二叉树相关题

文章目录 说明题目 144. 二叉树的前序遍历题解 题目 94. 二叉树的中序遍历题解 题目 145. 二叉树的后序遍历题解 题目 105. 从前序与中序遍历序列构造二叉树题解 题目 106. 从中序与后序遍历序列构造二叉树题解 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《刷题》的…

【深度学习】Softmax实现手写数字识别

实训1&#xff1a;Softmax实现手写数字识别 相关知识点: numpy科学计算包&#xff0c;如向量化操作&#xff0c;广播机制等 1 任务目标 1.1 简介 本次案例中&#xff0c;你需要用python实现Softmax回归方法&#xff0c;用于MNIST手写数字数据集分类任务。你需要完成前向计算…

python将Word页面纸张方向设置为横向

通过python-docx的章节属性&#xff0c;就可以更改纸张方向、纸张尺寸。 import docx from docx.enum.section import WD_ORIENT from docx.shared import Cmdocument docx.Document() section document.sections[0]# 设置纸张大小为A4大小 section.page_width Cm(21) sect…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称&#xff1a; 软件测试 英文名称&#xff1a; Software Testing 赛项编号&#xff1a; GZ034 归属产业&#xff1a; 电子与信息大类 …

语雀·教育邮箱现在提供免费一年会员资格!

作为一位深度使用电子笔记的用户&#xff0c;我曾长期使用印象笔记&#xff0c;后来发现有道云笔记也非常适合我的需求。然而&#xff0c;我最近发现语雀和飞书等云笔记服务越来越出色。&#xff08;相比之下&#xff0c;有道云笔记的启动速度较慢&#xff0c;而且存在各种广告…

JVM 性能调优- 五种内存溢出(5)

在介绍之前先简单介绍下 直接内存(Direct Memory)和堆内存(Heap Memory): 关系: 直接内存并不是Java虚拟机的一部分,它是通过Java的NIO库中的ByteBuffer来分配和管理的。直接内存通常由操作系统的本地内存(Native Memory)提供支持。堆内存是Java虚拟机的一部分,用于存…

在线音乐服务器测试报告

一、项目背景 在线音乐服务器采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将其部署到云服务器上。前端主要有个页面构成&#xff1a;登录页、音乐列表页、收藏音乐页等&#xff0c;以上模拟实现了最简单的在线音乐服务器。其结合后…

【深入浅出MySQL】「底层原理」InnoDB索引原理全程实操指南,带你从入门到精通

InnoDB索引原理全程实操指南&#xff0c;带你从入门到精通 每日一句前言概述正文介绍索引的介绍创建索引聚集索引非聚集索引**如果我的表没有建立主键该怎么办呢&#xff1f;** 索引原理什么情况不去聚集索引树去查询&#xff1f;版权声明 每日一句 不要停顿,因为别人会超过你;…

机器学习 | 揭示EM算法和马尔可夫链的实际应用

目录 初识EM算法 马尔可夫链 HMM模型基础 HMM模型使用 初识EM算法 EM算法是一种求解含有隐变量的概率模型参数的迭代算法。该算法通过交替进行两个步骤&#xff1a;E步骤和M步骤&#xff0c;从而不断逼近模型的最优参数值。EM算法也称期望最大化算法&#xff0c;它是一个基…

H12-821_28

28.如图所示,在一个纯IPv6环境中,若想实现PC1与PC2之间的通信,下列哪组地址可以分别配置在PC1与P2上 A.2001:FDC:1/64 2001:FDC::2/64 B.2001:FDC::1/64 2001:FDC1::2/64 C.FD00:1AC0:872E::1/64 FD00:2BE1:2320::1/64 D.FE80::1/64 FE80::2/64 答案&#xff1a;B 注释&…

Termux配置安卓编译环境

前言 Termux安装后&#xff0c;就相当于把手机变成了一台Linux服务器&#xff0c;而且现在手机卡通常是能拿到ipv6公网地址的&#xff0c;所以&#xff0c;这个服务器能干啥&#xff1f; 编程搭建网站跑脚本 本文讲述的就是怎么在Termux搭建安卓编译环境&#xff0c;实现手机…

c++之说_12|模板

关于模板&#xff0c;至少我们要先了解几个概念 一&#xff1a;函数模板 二&#xff1a;类模板 三&#xff1a;模板特化 四&#xff1a;形参参数包 模板覆盖的东西太多 我目前也不了解太多 函数模板 语法 template<typename 类型名,typename 类型名,typename ...多参…