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

设计模式(行为型模式)备忘录模式

目录

    • 一、简介
    • 二、备忘录模式
      • 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、备忘录模式 三、优点与缺点 一、简介 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;旨在捕获一个对象的内部状态&#xff0c;并在不破坏对象封装的前提下将其保存&#xff0c;以便…...

opencv案例实战:条码区域分割

前言 识别二维码是一个日常生活中常见的应用,而识别之前,需要先分割出条形码的区域来获取条形码。我们可以使用OpenCV便捷的获取条码的区域。 逐步分析 为了了解数据处理的过程,我们逐步分析并显示处理过程 查看图像 在读入时,传入参数cv2.IMREAD_GRAYSCALE可以直接按…...

《MySQL》超详细笔记

目录 基本知识 主流数据库 数据库基本概念 MySQL启动 数据库基本命令 数据库 启动数据库 显示数据库 创建数据库 删除数据库 使用数据库 查询当前数据库信息 显示数据库中的表 导入数据库脚本 表 查看表的结构 查看创建某个表的SQL语句 数据库的查询命令 查询…...

商用密码

商用密码&#xff08;Commercial Cryptography&#xff09;涉及到多个方面&#xff0c;包括但不限于数据加密、数字签名、身份验证和安全通信等。商用密码的目的是保护信息的机密性、完整性和可用性&#xff0c;确保数据在存储和传输过程中的安全。以下是一些Java商用密码方向的…...

css1文本属性

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

在容器中使用buildah构建镜像

简介 buildah是一个构建OCI标准镜像的工具&#xff0c;可以用来替代docker build 在常见的linux发行版中可直接通过包管理工具安装使用 # centos yum install buildah# ubuntu/debian apt install buildah# alpine apk add buildah其他发行版安装方法详见 github&#xff0c…...

GPT4_VS_ChatGPT(from_nytimes)

GPT4 VS ChatGPT&#xff08;from nytimes &#xff09; 正如文章官网博文&#xff1a;https://openai.com/research/gpt-4所述&#xff0c;GPT4仍有很多不足之处&#xff0c;还不及人类水平。纽约时报报道了一些人体验GPT4的效果和一些评价&#xff1a; Cade Metz 要求专家使…...

中兴R5300G4服务器查看服务器、主板序列号及硬盘RAID信息

本文在操作系统带内通过指令操作查看中兴R5300G4服务器、主板序列号及硬盘RAID信息。 一、中兴R5300G4服务器查看服务器、主板序列号 在Linux服务器上&#xff0c;可以使用dmidecode命令来查看服务器的硬件相关信息&#xff0c;由于该命令要读取系统的硬件信息&#xff0c;因…...

部署tomcat

1 idea打包完&#xff0c;找到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 枚举是否可以通过反射&#xff0c;拿到实例对象呢&#xff1f; 5 总结面试问题(单例模式学完后可以回顾)&#xff1a; 1 背景及定义 public static final int RED 1; public static final int GREEN 2; public …...

Python(20)正则表达式(Regular Expression)中常用函数用法

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 正文 正则表达式 粗略的定义&#xff1a;正则表达式是一个特殊的字符序列&#xff0c;帮助用户非常便捷的检查一个字符串是否符合某种模…...

docker 离线安装镜像

一、导出镜像 下载完镜像后&#xff0c;我们需要将其导出为tar文件&#xff0c;以便在离线环境中使用。 执行以下命令导出镜像&#xff1a; docker save -o <保存路径>/<镜像名>_<版本>.tar <镜像名>:<版本>其中&#xff0c;<保存路径>是…...

由vscode自动升级导致的“终端可以ssh服务器,但是vscode无法连接服务器”

问题描述 简单来说就是&#xff0c;ssh配置没动&#xff0c;前两天还可以用vscode连接服务器&#xff0c;今天突然就连不上了&#xff0c;但是用本地终端ssh可以顺利连接。 连接情况 我的ssh配置如下&#xff1a; Host gpu3HostName aaaUser zwx现在直接在终端中进行ssh&am…...

typecho 在文章中添加 bilibili 视频

一、获取视频来源&#xff1a; 可以有2种方式来定位一个 bilibili 视频&#xff1a; 第一种是使用 bvid 参数定位第二种是使用 aid 参数定位 如何获取这两个参数&#xff1f; 首先我们可以看看 bilibili 网站中的视频页面链接其实可以分为两种&#xff1a; 第一种是类似&a…...

Android.mk 语法详解

一.Android.mk简介 Android.mk 是Android 提供的一种makefile 文件,注意用来编译生成&#xff08;exe&#xff0c;so&#xff0c;a&#xff0c;jar&#xff0c;apk&#xff09;等文件。 二.Android.mk编写 分析一个最简单的Android.mk LOCAL_PATH : $(call my-dir) //定义了…...

ChatGPT高效提问—prompt基础

ChatGPT高效提问—prompt基础 ​ 设计一个好的prompt对于获取理想的生成结果至关重要。通过选择合适的关键词、提供明确的上下文、设置特定的约束条件&#xff0c;可以引导模型生成符合预期的回复。例如&#xff0c;在对话中&#xff0c;可以使用明确的问题或陈述引导模型生成…...

Elasticsearch 中的索引的分区(Shards)和副本(Replicas)的使用

Elasticsearch是一个高性能的、分布式的搜索与数据分析引擎&#xff0c;广泛用于全文搜索、结构化搜索、分析以及这三者的组合场景。在Elasticsearch中&#xff0c;“索引”&#xff08;Index&#xff09;是其最基本的数据管理单位&#xff0c;可以类比为传统关系数据库中的“数…...

智慧工地反光衣识别检测系统-自动识别是否穿着制定工作服---豌豆云

智慧工地反光衣识别检测特定地区工作人员不穿反光服装个人行为预警&#xff0c;一旦检测到某些不穿反光服装施工作业人员智慧工地反光衣识别检测马上开启警报。 真真正正做到事前预警、事中检测、过后管理。安全操作规程工作人员从繁杂无趣的盯显示屏的每日任务中抽身出去。 …...

vue绘制语音波形图---wavesurfer.js

文章目录 创建实例optionsmethod接收Blob流 https://wavesurfer.xyz/ 创建实例 引入插件&#xff1a;import WaveSurfer from "wavesurfer.js"创建实例对象&#xff1a;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 新一代的…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...