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

设计模式-备忘录模式(Memento Pattern)

文章目录

  • 前言
  • 一、备忘录模式的概念
  • 二、备忘录模式的实现
  • 三、备忘录优缺点
      • 优点:
      • 缺点:
      • 总结

前言

备忘录模式(Memento Pattern)是一种行为型设计模式,它用于捕获和存储对象的内部状态,以便在以后可以恢复到先前的状态。备忘录模式允许对象在不暴露其内部状态的情况下保存和还原状态,从而提供了一种简单的方式来实现撤销和恢复功能。

在本篇博客中,我们将详细介绍备忘录模式的概念,并提供一个简单的Java代码示例来演示如何实现它。

一、备忘录模式的概念

备忘录模式的核心思想是将对象的状态保存在一个备忘录对象中,并将备忘录对象存储在一个外部管理器中,以便随时可以将对象恢复到先前的状态。备忘录模式包含以下几个要素:

  1. 发起人(Originator):负责创建备忘录对象,将自己的状态保存到备忘录中,并从备忘录中恢复状态。

  2. 备忘录(Memento):负责存储发起人的内部状态。备忘录对象通常具有只读接口,只能由发起人访问。

  3. 管理者(Caretaker):负责存储和管理备忘录对象。管理者不应该访问或修改备忘录的内容,只负责存储和提供备忘录对象给发起人。

二、备忘录模式的实现

让我们通过一个简单的示例来演示备忘录模式的实现。我们将创建一个文本编辑器应用程序,其中用户可以编辑文本,并且可以随时撤销和恢复编辑操作。

首先,我们定义备忘录对象 TextEditorMemento,它保存文本编辑器的状态:

class TextEditorMemento {private String text;public TextEditorMemento(String text) {this.text = text;}public String getText() {return text;}
}

然后,我们创建文本编辑器 TextEditor,它包含编辑文本和撤销操作:

class TextEditor {private String text;public void setText(String text) {this.text = text;}public String getText() {return text;}public TextEditorMemento save() {return new TextEditorMemento(text);}public void restore(TextEditorMemento memento) {text = memento.getText();}
}

接下来,我们编写客户端代码来测试备忘录模式:

public class MementoPatternDemo {public static void main(String[] args) {TextEditor textEditor = new TextEditor();textEditor.setText("Hello, World!");// 保存状态TextEditorMemento memento = textEditor.save();// 修改文本textEditor.setText("New Text");// 恢复到先前状态textEditor.restore(memento);System.out.println("Current Text: " + textEditor.getText()); // 输出: Current Text: Hello, World!}
}

在这个示例中,我们创建了一个文本编辑器 TextEditor,它可以保存和恢复状态。客户端可以使用 save 方法保存当前状态,并使用 restore 方法恢复到先前的状态,从而实现了撤销和恢复功能。

三、备忘录优缺点

备忘录模式(Memento Pattern)是一种有用的设计模式,但它也有一些明显的优点和缺点。让我们首先讨论一下备忘录模式的优点:

优点:

  1. 状态保存和恢复:备忘录模式允许对象在不暴露其内部状态的情况下保存和恢复状态。这对于实现撤销、恢复和历史记录等功能非常有用。

  2. 简化发起人:备忘录模式使得发起人(对象需要保存状态的对象)的代码变得更加简洁,因为状态的管理和存储被委托给备忘录对象。

  3. 多状态保存:发起人可以创建多个备忘录对象,从而可以保存多个不同时间点的状态。这使得可以在不同的时间点之间切换状态。

  4. 封装性:备忘录对象封装了状态信息,只有发起人可以访问备忘录的内容,从而保护了状态的完整性和隐私性。

缺点:

  1. 内存消耗:如果备忘录对象较大或备忘录的数量较多,可能会占用大量内存。需要谨慎管理备忘录的生命周期,确保及时销毁不再需要的备忘录。

  2. 复杂性增加:在某些情况下,引入备忘录模式可能会增加代码的复杂性。特别是在需要频繁保存和恢复状态的情况下,可能会引入额外的复杂性。

  3. 性能开销:备忘录模式涉及创建、保存和恢复状态的操作,可能会引入一定的性能开销。对于性能要求很高的应用程序,需要仔细考虑备忘录的使用。

  4. 不适用于所有情况:备忘录模式主要用于需要保存和恢复对象状态的情况。对于不需要这种功能的情况,引入备忘录模式可能会显得过于繁琐。

总的来说,备忘录模式是一种有助于实现状态保存和恢复的强大模式,特别适用于需要实现撤销、恢复和历史记录等功能的应用程序。但需要权衡其优点和缺点,并根据具体需求来决定是否使用备忘录模式。在某些情况下,可能有更简单的方法来实现相同的功能。

总结

备忘录模式是一种非常有用的设计模式,它允许对象保存和还原状态,从而提供了撤销和恢复功能。这在许多应用程序中都是非常有用的,例如文本编辑器、游戏中的进度保存等。备忘录模式的关键思想是将状态分离和封装在备忘录对象中,以便于管理和恢复。当需要实现撤销和恢复功能时,备忘录模式是一个强大的工具。

相关文章:

设计模式-备忘录模式(Memento Pattern)

文章目录 前言一、备忘录模式的概念二、备忘录模式的实现三、备忘录优缺点优点:缺点:总结 前言 备忘录模式(Memento Pattern)是一种行为型设计模式,它用于捕获和存储对象的内部状态,以便在以后可以恢复到先…...

PHP对接阿里云虚拟号的实现(号码隐私保护)

fastadmin 封装框架 实现功能:AXN隐私号绑定、解绑; 场景:为店铺手机号开通虚拟号,用户联系店铺展示虚拟号码; 官方开放文档地址:https://help.aliyun.com/document_detail/59655.html?spma2c4g.111742…...

刷新单年发射纪录:SpaceX成功发射62次猎鹰9号火箭

SpaceX一直都致力于推进航天领域的发展。近日,该公司的猎鹰9号火箭再次刷新了单年发射纪录,目前已经成功发射了62次。除此之外,今年SpaceX还发射了一枚猎鹰火箭和一枚巨型火箭。马斯克表示,他的目标是实现每月10次猎鹰飞行&#x…...

项目打包docker镜像 | 上传nexus | jenkins一键构建

文章目录 前言准备实操1、打开docker的远程访问2、编写dockerfile文件3、指定nexus环境4、配置jenkins5、使用jenkins构建 总结 前言 Docker部署项目是指使用Docker容器化技术将应用程序及其依赖项打包成一个独立的、可移植的运行环境,并在各种操作系统和平台上进行…...

ios 运行ipa包 日志查看方式

方法一: 使用ideviceinstaller工具 # 安装ipa命令 brew install ideviceinstaller ideviceinstaller -i xxx.ipa# 查看运行日志 idevicesyslog# idevicesyslog 查找命令 idevicesyslog | grep test -A 3 -B 2 # 输出关键字所在行后3行,前2行) idevic…...

AUTOSARCAN-Tp协议

目录 一.单帧、首帧、连续帧、流控帧 单帧传输 SF单帧: 多帧传输 FF(首帧): CF(连续帧): FC(流控帧): 一.单帧、首帧、连续帧、流控帧 CAN诊断由发送端…...

【设计模式】组合模式实现部门树实践

1.前言 几乎在每一个系统的开发过程中,都会遇到一些树状结构的开发需求,例如:组织机构树,部门树,菜单树等。只要是需要开发这种树状结构的需求,我们都可以使用组合模式来完成。 本篇将结合组合模式与Mysq…...

恒林家居引入纷享销客CRM系统,领跑家居行业营销数字化进程

近日,恒林家居股份有限公司((股票代码:603661以下简称为“恒林家居”)携手纷享销客在湖州召开了CRM项目启动会。双方领导及核心项目人员齐聚一堂,展开了深度交流并达成了重要共识。 作为家居行业的领军企业…...

多线程-锁的种类

1 作用 Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性,我们通常需要在使用对象或者方法之前加锁,这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会…...

Hive 和 HDFS、MySQL 之间的关系

文章目录 HiveHDFSMySQL三者的关系 Hive、MySQL 和 HDFS 是三个不同的数据存储和处理系统,它们在大数据生态系统中扮演不同的角色,但可以协同工作以支持数据管理和分析任务。 Hive Hive 是一个基于 Hadoop 生态系统的数据仓库工具,用于管理和…...

【面试题】如何实现数组去重的?有几种方式?

前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 【国庆头像】- 国庆爱国 程序员头像!总有一款适合你! 1. 方法一:利用两层循环数组的splice方法 通过两层循环对数组…...

使用TCP方式拉取Canal数据

1 Canal对接Kafka联调 1.1 配置修改 canal.properties 修改 zk: canal.zkServers 10.51.50.219:2181instance.properties 开启配置项: canal.mq.dynamicTopic 是 Canal 的 MQ 动态 Topic 配置项: test_javaedge_01 是kafka 的 topicte…...

Docker安装mysql实战说明

安装前准备 在安装MySQL之前,你需要确保已经正确安装和配置了Docker,可以通过以下命令检查Docker是否已正确安装: docker --version如果Docker已经成功安装,你将看到Docker的版本信息。 下载mysql的镜像 Docker Hub是一个存储…...

前端DOM操作精解:基础概念、方法与最佳实践

引言 本文将深入探讨前端开发中的DOM操作,包括基础概念、常用方法和最佳实践。通过清晰易懂的解释和实际案例分析,我们将一起了解如何最有效地使用DOM操作来提升前端应用的用户体验。 一、DOM操作入门 在深入探讨DOM操作之前,我们先要理解…...

python sorted函数详解2023.9.11

sorted函数详解 1. 输入和输出2. key传入函数 1. 输入和输出 help(sorted) Help on built-in function sorted in module builtins: sorted(iterable, /, *, keyNone, reverseFalse)Return a new list containing all items from the iterable in ascending order.A custom k…...

Spring Reactive:响应式编程与WebFlux的深度探索

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

Qt应用开发(基础篇)——工具按钮类 QToolButton

一、前言 QToolButton类继承于QAbstractButton,该部件为命令或选项提供了一个快速访问按钮,通常用于QToolBar中。 按钮基类 QAbstractButton QToolButton是一个特殊的按钮,一般显示文本,只显示图标,结合toolBar使用。它…...

【数据结构面试题】栈与队列的相互实现

目录 1.队列实现栈 1.1创建栈 1.2判断是否为空 1.3入栈 1.4出栈 1.5获取栈顶元素 1.6完整代码 2. 用栈实现队列 2.1创建队列 2.2判断是否为空 2.3入队列 2.4出队列 2.5获取队头元素 2.6完整代码 1.队列实现栈 用队列实现栈https://leetcode.cn/problems/impleme…...

华为认证和红帽认证哪个比较好考呢

华为认证和红帽认证的考试难度、学习内容、适用范围等方面都有所不同,因此哪个比较好考要视具体情况而定: 考试难度:红帽认证的考试难度较高,需要考生具备较高的技术水平和实践经验;而华为认证则更注重基础知识的考察…...

[Java]_[中级]_[使用okhttp3和HttpClient代理访问外部网络]

场景 Java的http库常用的有HttpClient和Okhttp3, 如果公司有限制网络访问&#xff0c;需要代理才可以访问外网&#xff0c;那么如何使用代理Proxy&#xff1f; <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient<…...

ubuntu 20.04 docker 安装 mysql

要在Ubuntu 20.04上安装Docker并运行MySQL容器&#xff0c;您可以按照以下步骤操作&#xff1a; 1.更新系统包列表&#xff1a; sudo apt update2.安装Docker&#xff1a; sudo apt install docker.io3.启动Docker服务并设置其开机自启动&#xff1a; sudo systemctl start…...

C++在C语言基础上的优化

目录 一、命名空间 1、命名空间的定义 2、命名空间的使用 二、输入&输出 三、缺省参数 1、缺省参数的概念 2、缺省参数的分类 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3、引用和指针的区别 六、内联函数 七、基于范围的for循环 一、命名空间 命名空…...

分享一个python实验室设备预约管理系统 实验室设备维修系统源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

兵者多诡(HCTF2016)

环境:https://github.com/MartinxMax/CTFer_Zero_one 题目简介 解题过程 登录首页 提交png图片上传抓包&#xff0c;可以看到是向upload文件提交数据 在fp参数中尝试伪协议读取home.php文件 http://127.0.0.1:88/HCTF2016-LFI/home.php?fpphp://filter/readconvert.base64…...

【JAVA-Day04】Java关键字和示例:深入了解常用关键字的用法

Java关键字和示例&#xff1a;深入了解常用关键字的用法 摘要Java 关键字、标识符和命名规范一、Java 关键字常用关键字DEMO1. 示例代码使用 if 和 else 关键字&#xff1a;2. 示例代码使用 for 循环&#xff1a;3. 示例代码使用 switch 关键字&#xff1a;4. 示例代码使用 wh…...

Android请求网络报错:not permitted by network security policy

一、错误记录 https的接口请求正常的&#xff0c; 请求http的接口时报错&#xff1a;not permitted by network security policy 二、问题分析 原因&#xff1a; 由于 Android P(版本27以上) 限制了明文流量的网络请求&#xff0c;非加密的流量请求都会被系统禁止掉。如果当…...

python报错:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1

python报错&#xff1a;ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 问题分析 说明&#xff1a;requests包引入了urllib3&#xff0c;而新版本的urllib3 需要OpenSSL 1.1.1以上版本&#xff0c;否则报错&#xff1a; ImportError: urllib3 v2.0 only supports Ope…...

如何使用adb command来设置cpu频率和核数

透過ADB Shell設定CPU開核與freq的command與用法如下: # Disable PPM echo 0 > /proc/ppm/enabled # Enable PPM (Default) echo 1 > /proc/ppm/enabled echo 0 > /proc/ppm/enabled Fixed # Core for each cluster echo X Y > /proc/ppm/policy/ut_fix_core_num …...

236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 题目-中等难度示例1. dfs 题目-中等难度 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p…...

Git常见问题:git pull 和 git pull --rebase二者区别

git pull 和 git pull --rebase 都是从远程仓库获取最新的更改并将其合并到本地分支。但它们之间的区别在于合并方式。以下是它们之间的主要区别&#xff1a; git pull&#xff1a; 当你执行 git pull 时&#xff0c;Git 会执行以下两个操作&#xff1a; git fetch&#xff…...

wordpress+dux5.0/seo优化教程视频

播放铃声&#xff1a; Uri notification RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); Ringtone r RingtoneManager.getRingtone(context,notification); r.play(); 系统闹钟源码分析...

网站上做旅游卖家要学什么/引流软件有哪些

很久之前就看过attention的相关知识&#xff0c;只是没有动手实践&#xff0c;所以很多小细节没有考虑到&#xff0e; &#xff08;&#xff11;&#xff09;sequence-to-sequence model中&#xff0c;在解码的第一步S0_00​是如何计算的就晕了好一阵&#xff0c;下面的图给出了…...

专业网站建设首选公司/网络运营具体做什么

http://blog.csdn.net/0210/article/details/5437368 http://blog.csdn.net/vebasan/article/details/5515235 ifconfig 如果不能用&#xff0c;就用/sbin/ifconfig ifconfig -a 所有的网卡情况 ifconfig 就会出现当前正在使用的网卡的情况&#xff0c; eth0 eth0:0 //和上…...

北京网站定制设计开发公司/网络广告营销策略

无论服务端或客户端启动时都用到了NioEventLoopGroup&#xff0c;从名字就可以看出来它是NioEventLoop的组合&#xff0c;是Netty多线程的基石。 类结构 NioEventLoopGroup继承自MultithreadEventLoopGroup&#xff0c;多提供了两个方法setIoRatio和rebuildSelectors&#xff0…...

怎么做线上营销/seo网站优化培训找哪些

2019独角兽企业重金招聘Python工程师标准>>> 1. 提前准备&#xff1a;mac电脑&#xff08;or虚拟机&#xff09;&#xff0c;空U盘&#xff08;最低8GB的&#xff09;、sierra.app(app store上下载的) 2. 前往&#xff0d;实用工具&#xff0c;运行里面的“磁盘工具…...

电脑做网站空间/windows优化大师是系统软件吗

对于python列表里元素的操作主要分为以下几个方面&#xff1a; 1、向列表里面加元素&#xff1b; 向python列表里面添加元素主要有三种方法&#xff1a; &#xff08;1&#xff09;append&#xff08;&#xff09; append()对于列表的操作主要实现的是在特定的列表最后添加一个…...