设计模式(行为型模式)备忘录模式
目录
- 一、简介
- 二、备忘录模式
- 2.1、备忘录
- 2.2、原发器
- 2.3、备忘录模式
- 三、优点与缺点
一、简介
备忘录模式(Memento Pattern)是一种行为设计模式,旨在捕获一个对象的内部状态,并在不破坏对象封装的前提下将其保存,以便稍后可以恢复到先前的状态。
备忘录模式指的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,从而在需要时能将对象恢复到先前的状态。这种模式涉及三个主要角色:原发器(Originator)、备忘录(Memento)和管理者(Caretaker)。
- 原发器(Originator):负责创建一个备忘录,并记录当前状态到备忘录对象,也可以从备忘录对象中恢复状态。
- 备忘录(Memento):用于存储原发器对象的内部状态。备忘录可以记录原发器对象的部分或全部状态。
- 管理者(Caretaker):负责存储备忘录对象,但不能对备忘录的内容进行操作,只能够将备忘录传递给其他对象。
备忘录模式允许在不暴露对象实现细节的情况下保存和恢复对象的状态,提供了一种方便的方式来回滚对象的状态到先前的状态,以支持撤销和恢复等操作。
二、备忘录模式
当涉及到备忘录模式时,一个经典的案例是文本编辑器中的撤销(Undo)和恢复(Redo)功能。我们先创建一个简单的文本编辑器示例,展示如何使用备忘录模式实现撤销和恢复功能:
2.1、备忘录
// 备忘录:用于保存文本编辑器的状态
public class TextEditorMemento {private final String content;public TextEditorMemento(String content) {this.content = content;}public String getContent() {return content;}
}
2.2、原发器
import java.util.Stack;// 原发器:文本编辑器
public class TextEditor {private String content;private final Stack<TextEditorMemento> history;public TextEditor() {this.content = "";this.history = new Stack<>();}public void write(String text) {saveState();content += text;}public void undo() {if (!history.isEmpty()) {content = history.pop().getContent();}}private void saveState() {history.push(new TextEditorMemento(content));}public void printContent() {System.out.println("当前内容: " + content);}
}
2.3、备忘录模式
// 测试类
public class MementoPatternExample {public static void main(String[] args) {TextEditor editor = new TextEditor();editor.write("Hello ");editor.write("GoLang!");editor.printContent(); // 输出:当前内容: Hello GoLang!editor.undo();editor.printContent(); // 输出:当前内容: Hello }
}
运行结果:
当前内容: Hello GoLang!
当前内容: Hello
三、优点与缺点
备忘录模式具有以下优点和缺点:
优点
- 封装性良好: 备忘录模式可以在不破坏对象封装性的前提下,捕获和保存对象的状态,对客户端隐藏了对象的实现细节。
- 状态保存与恢复: 允许在需要时将对象状态保存到备忘录中,并在之后将对象恢复到先前的状态,支持撤销和恢复操作。
- 简化原发器类: 备忘录模式可以使得原发器类的代码更加简洁,将状态保存和恢复的责任分离出去。
缺点
- 资源消耗: 当需要频繁保存状态时,会消耗一定的内存资源,尤其是当状态对象非常大或者对象频繁变动时。
- 潜在性能问题: 保存大量状态信息可能会影响性能,特别是当备忘录对象的管理成本增加时。
- 不适合大规模对象: 对于大规模的对象,保存和管理其多个状态可能会变得复杂和低效。
总的来说,备忘录模式适用于需要保存和恢复对象状态、支持撤销和恢复操作的场景。它提供了一种简单、清晰的方式来管理对象状态,但需要权衡资源消耗和性能问题。通常在需要保存状态快照以支持撤销操作的情况下才会使用备忘录模式。
相关文章:
设计模式(行为型模式)备忘录模式
目录 一、简介二、备忘录模式2.1、备忘录2.2、原发器2.3、备忘录模式 三、优点与缺点 一、简介 备忘录模式(Memento Pattern)是一种行为设计模式,旨在捕获一个对象的内部状态,并在不破坏对象封装的前提下将其保存,以便…...
opencv案例实战:条码区域分割
前言 识别二维码是一个日常生活中常见的应用,而识别之前,需要先分割出条形码的区域来获取条形码。我们可以使用OpenCV便捷的获取条码的区域。 逐步分析 为了了解数据处理的过程,我们逐步分析并显示处理过程 查看图像 在读入时,传入参数cv2.IMREAD_GRAYSCALE可以直接按…...
《MySQL》超详细笔记
目录 基本知识 主流数据库 数据库基本概念 MySQL启动 数据库基本命令 数据库 启动数据库 显示数据库 创建数据库 删除数据库 使用数据库 查询当前数据库信息 显示数据库中的表 导入数据库脚本 表 查看表的结构 查看创建某个表的SQL语句 数据库的查询命令 查询…...
商用密码
商用密码(Commercial Cryptography)涉及到多个方面,包括但不限于数据加密、数字签名、身份验证和安全通信等。商用密码的目的是保护信息的机密性、完整性和可用性,确保数据在存储和传输过程中的安全。以下是一些Java商用密码方向的…...
css1文本属性
一.颜色(color)(一般用16进制) 二.对齐(text-align) 三.装饰(text-decoration) 四.缩进(text-indent)(一般用2em)(有单位)…...
在容器中使用buildah构建镜像
简介 buildah是一个构建OCI标准镜像的工具,可以用来替代docker build 在常见的linux发行版中可直接通过包管理工具安装使用 # centos yum install buildah# ubuntu/debian apt install buildah# alpine apk add buildah其他发行版安装方法详见 github,…...
GPT4_VS_ChatGPT(from_nytimes)
GPT4 VS ChatGPT(from nytimes ) 正如文章官网博文:https://openai.com/research/gpt-4所述,GPT4仍有很多不足之处,还不及人类水平。纽约时报报道了一些人体验GPT4的效果和一些评价: Cade Metz 要求专家使…...
中兴R5300G4服务器查看服务器、主板序列号及硬盘RAID信息
本文在操作系统带内通过指令操作查看中兴R5300G4服务器、主板序列号及硬盘RAID信息。 一、中兴R5300G4服务器查看服务器、主板序列号 在Linux服务器上,可以使用dmidecode命令来查看服务器的硬件相关信息,由于该命令要读取系统的硬件信息,因…...
部署tomcat
1 idea打包完,找到target目录下的网站 我的叫做 test.webSYS 2 linux 安装 tomcat 后 修改conf下的server.xml中的Connector的port <Connector port"9001" protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443…...
【Java 数据结构】枚举
枚举的使用 1 背景及定义2 使用3 枚举优点缺点4 枚举和反射4.1 枚举是否可以通过反射,拿到实例对象呢? 5 总结面试问题(单例模式学完后可以回顾): 1 背景及定义 public static final int RED 1; public static final int GREEN 2; public …...
Python(20)正则表达式(Regular Expression)中常用函数用法
大家好!我是码银🥰 欢迎关注🥰: CSDN:码银 公众号:码银学编程 正文 正则表达式 粗略的定义:正则表达式是一个特殊的字符序列,帮助用户非常便捷的检查一个字符串是否符合某种模…...
docker 离线安装镜像
一、导出镜像 下载完镜像后,我们需要将其导出为tar文件,以便在离线环境中使用。 执行以下命令导出镜像: docker save -o <保存路径>/<镜像名>_<版本>.tar <镜像名>:<版本>其中,<保存路径>是…...
由vscode自动升级导致的“终端可以ssh服务器,但是vscode无法连接服务器”
问题描述 简单来说就是,ssh配置没动,前两天还可以用vscode连接服务器,今天突然就连不上了,但是用本地终端ssh可以顺利连接。 连接情况 我的ssh配置如下: Host gpu3HostName aaaUser zwx现在直接在终端中进行ssh&am…...
typecho 在文章中添加 bilibili 视频
一、获取视频来源: 可以有2种方式来定位一个 bilibili 视频: 第一种是使用 bvid 参数定位第二种是使用 aid 参数定位 如何获取这两个参数? 首先我们可以看看 bilibili 网站中的视频页面链接其实可以分为两种: 第一种是类似&a…...
Android.mk 语法详解
一.Android.mk简介 Android.mk 是Android 提供的一种makefile 文件,注意用来编译生成(exe,so,a,jar,apk)等文件。 二.Android.mk编写 分析一个最简单的Android.mk LOCAL_PATH : $(call my-dir) //定义了…...
ChatGPT高效提问—prompt基础
ChatGPT高效提问—prompt基础 设计一个好的prompt对于获取理想的生成结果至关重要。通过选择合适的关键词、提供明确的上下文、设置特定的约束条件,可以引导模型生成符合预期的回复。例如,在对话中,可以使用明确的问题或陈述引导模型生成…...
Elasticsearch 中的索引的分区(Shards)和副本(Replicas)的使用
Elasticsearch是一个高性能的、分布式的搜索与数据分析引擎,广泛用于全文搜索、结构化搜索、分析以及这三者的组合场景。在Elasticsearch中,“索引”(Index)是其最基本的数据管理单位,可以类比为传统关系数据库中的“数…...
智慧工地反光衣识别检测系统-自动识别是否穿着制定工作服---豌豆云
智慧工地反光衣识别检测特定地区工作人员不穿反光服装个人行为预警,一旦检测到某些不穿反光服装施工作业人员智慧工地反光衣识别检测马上开启警报。 真真正正做到事前预警、事中检测、过后管理。安全操作规程工作人员从繁杂无趣的盯显示屏的每日任务中抽身出去。 …...
vue绘制语音波形图---wavesurfer.js
文章目录 创建实例optionsmethod接收Blob流 https://wavesurfer.xyz/ 创建实例 引入插件:import WaveSurfer from "wavesurfer.js"创建实例对象:this.wavesurfer WaveSurfer.create(options); <div id"waveform"><!-- t…...
MPLS——多协议标签交换
目录 1 多协议标签交换 MPLS 1.1 MPLS 的工作原理 1.1.1 MPLS 工作特点 1.1.2 MPLS 协议的基本原理 1.1.3 MPLS 的基本工作过程 1.2 转发等价类 FEC 1.2.1 FEC 用于负载平衡 1.3 MPLS 首部的位置与格式 1.3.1 MPLS 首部的位置 1.3.2 MPLS 首部的格式 1.4 新一代的…...
人脸识别OOD模型在医疗领域的应用探索
人脸识别OOD模型在医疗领域的应用探索 1. 引言 在医院里,每天都有成千上万的患者需要身份确认、用药核对和病情监测。传统的医疗身份验证方式如手环、身份证件等存在被冒用、丢失或信息错误的风险。而医护人员在繁忙的工作中,也可能因为疲劳或疏忽而错…...
别再手动填Excel了!用Java+Spire.XLS 15.6.3实现批量报表自动化(附完整源码)
Java报表自动化革命:Spire.XLS实战指南与生产力跃迁 凌晨三点的办公室,最后一份月度销售报表终于核对完毕。这样的场景是否似曾相识?据统计,全球超过70%的企业级数据仍通过Excel流转,而其中近40%的时间消耗在机械化的…...
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾为游戏不支持你的手柄…...
SiameseUIE详细步骤:cd .. + cd nlp_structbert_siamese-uie_chinese-base执行逻辑
SiameseUIE详细步骤:cd .. cd nlp_structbert_siamese-uie_chinese-base执行逻辑 1. 为什么需要这个执行顺序 当你拿到一个已经部署好的AI模型镜像,第一件事就是找到正确的打开方式。cd .. 和 cd nlp_structbert_siamese-uie_chinese-base 这个看似简…...
手把手教你用AI手势识别镜像:上传图片秒出彩虹骨骼图
手把手教你用AI手势识别镜像:上传图片秒出彩虹骨骼图 1. 快速了解AI手势识别镜像 今天要介绍的是一个非常实用的AI工具——基于MediaPipe Hands模型的手势识别镜像。这个工具最大的特点就是简单易用,你只需要上传一张包含手部的图片,它就能…...
OpenClaw技能扩展:基于nanobot实现Markdown自动转换
OpenClaw技能扩展:基于nanobot实现Markdown自动转换 1. 为什么需要文档自动化转换 在日常工作中,我们经常需要处理各种格式的文档——Word、PDF、PPT、Excel甚至网页内容。手动将这些文档转换为Markdown格式不仅耗时,还容易出错。作为一名技…...
3步搞定浏览器脚本:Greasy Fork小白也能懂的终极指南
3步搞定浏览器脚本:Greasy Fork小白也能懂的终极指南 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 你是否厌倦了网页上烦人的广告?想要自动填充表单、一键下载视…...
深入探索UEFI Shell中的dh命令:高效检测系统Protocol安装状态
1. UEFI Shell与dh命令基础认知 刚接触UEFI开发时,我经常遇到这样的困扰:某个驱动明明编译通过了,运行时却提示"Protocol not found"。传统做法是在代码里插入调试语句,用gBS->LocateProtocol检查Protocol状态&#…...
一键部署体验:圣女司幼幽-造相Z-Turbo文生图模型效果实测
一键部署体验:圣女司幼幽-造相Z-Turbo文生图模型效果实测 1. 模型简介与部署准备 圣女司幼幽-造相Z-Turbo是一款基于Z-Image-Turbo模型的LoRA微调版本,专门用于生成《牧神记》中角色"圣女司幼幽"的高质量图像。该模型通过Xinference框架部署…...
别再只调headingPitchRoll了!深入Cesium矩阵变换,从原理到代码理解模型朝向控制
深入Cesium矩阵变换:从数学原理到模型朝向控制的实战指南 在三维地理可视化领域,精确控制模型朝向一直是开发者面临的挑战。许多开发者习惯使用现成的headingPitchRoll方法,但当遇到复杂场景如极地附近模型旋转异常时,往往束手无策…...
