Java设计模式之备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。该模式通过在对象之外保存和恢复对象的状态,使得对象可以在需要时回滚到之前的状态。

在备忘录模式中,有三个核心角色:

  1. 发起人(Originator):它是需要保存状态的对象。它可以创建一个备忘录对象,用于保存当前状态,并可以使用备忘录对象恢复其状态。
  2. 备忘录(Memento):它是保存发起人对象状态的对象。备忘录对象提供一个接口,允许发起人对象访问其内部状态(或者在某些情况下,允许其他对象访问)。
  3. 管理者(Caretaker):它负责保存和恢复备忘录对象。管理者对象可以存储多个备忘录对象,并在需要时将其提供给发起人对象。

下面是一个示例,展示了如何使用备忘录模式来保存和恢复发起人对象的状态。假设我们有一个文本编辑器,用户可以输入文本并进行撤销操作。

// 发起人(Originator)
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) {this.text = memento.getText();}
}// 备忘录(Memento)
class TextEditorMemento {private String text;public TextEditorMemento(String text) {this.text = text;}public String getText() {return text;}
}// 管理者(Caretaker)
class TextEditorHistory {private Stack<TextEditorMemento> history = new Stack<>();public void push(TextEditorMemento memento) {history.push(memento);}public TextEditorMemento pop() {return history.pop();}
}// 示例使用
public class Main {public static void main(String[] args) {TextEditor textEditor = new TextEditor();TextEditorHistory history = new TextEditorHistory();// 编辑文本textEditor.setText("Hello, World!");// 保存状态history.push(textEditor.save());// 修改文本textEditor.setText("Hello, Java!");// 保存状态history.push(textEditor.save());// 恢复到之前的状态textEditor.restore(history.pop());System.out.println(textEditor.getText());  // 输出: Hello, Java!textEditor.restore(history.pop());System.out.println(textEditor.getText());  // 输出: Hello, World!}
}

在上面的示例中,TextEditor 是发起人角色,它保存了文本编辑器的状态,并提供了保存和恢复状态的方法。TextEditorMemento 是备忘录角色,它保存了发起人对象的状态。TextEditorHistory 是管理者角色,它保存了多个备忘录对象,并提供了保存和恢复备忘录的方法。通过使用备忘录模式,我们可以在文本编辑器中保存多个状态,并在需要时恢复到之前的状态。

推荐一个ChatGPT使用渠道:点击直达

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

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

相关文章

二叉树,堆排序及TopK问题

要讲二叉树的概念&#xff0c;就要先讲树的概念。 树是什么呢&#xff1f; 树其实是一种储存数据的结构&#xff0c;因为他的结构倒过来和生活中的树很相似所以才被称之为树。 这是一颗多叉树&#xff0c;从最顶端的节点可以找到下边的几个节点&#xff0c;下边的节点又可以找…

【容器】Containerd产生及和Docker对比

目录 背景 Docker介绍 Containerd介绍 常用命令对比 自 Kubernetes v1.24 起&#xff0c;Dockershim 已被删除&#xff0c;k8s将Containerd作为其容器运行时&#xff0c;那此次变化对容器化有何影响呢&#xff0c;本文进行简单介绍 背景 在 Kubernetes 早期&#xff0c;只支…

Chrome插件精选 — 标签效率管理插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. OneTab Plus 下…

算法进修Day-32

算法进修Day-32 63. 不同路径II 难度&#xff1a;中等 题目要求&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记…

从0-1,使用腾讯OCR进行身份证识别

目录 1.申请腾讯OCR权限 2.代码思路 3.Postman测试​ 1.申请腾讯OCR权限 获取 secretId 和 secretKey&#xff0c;见上文从0到1&#xff0c;申请cos服务器并上传图片到cos文件服务器-CSDN博客https://blog.csdn.net/m0_55627541/article/details/133902798 2.代码思路 入参…

【PXIE301-211】青翼科技基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台

板卡概述 PXIE301-211是一款基于PXIE总线架构的16路并行LVDS数据采集、1路光纤收发处理平台&#xff0c;该板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器&#xff0c;实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡具有1个FMC&#xf…

2023_Spark_实验十四:SparkSQL入门操作

1、将emp.csv、dept.csv文件上传到分布式环境&#xff0c;再用 hdfs dfs -put dept.csv /input/ hdfs dfs -put emp.csv /input/ 将本地文件put到hdfs文件系统的input目录下 2、或者调用本地文件也可以。区别&#xff1a;sc.textFile("file:///D:\\temp\\emp.csv&qu…

OpenLDAP LDIF详解

手把手一步步搭建LDAP服务器并加域 有必要理解的概念LDAPWindows Active Directory 服务器配置安装 OpenLDAP自定义安装修改对象&#xff08;用户和分组等&#xff09;修改olcSuffix 和 olcRootDN 属性增加olcRootPW 属性修改olcAccess属性验证新属性值 添加对象&#xff08;用…

【C语言必知必会 | 第四篇】一文带你精通顺序结构

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第四篇&#xff0c;进行C语言顺序结构的专项练习&#xff0c;结合专题优质题目&#xff0c;带领读者从0开始&#xff0…

AndroidX使用Paho MQTT报找不到android/support/v4/content/LocalBroadcastManager

网上有直接引用support-v4包的&#xff0c;但我用的AndroidX&#xff0c;不能为这个类再引用support-v4 直接自己创建这个类&#xff0c;把androidx.localbroadcastmanager.content.LocalBroadcastManager改改就行。 虽然奇葩但能解决问题 package android.support.v4.content…

[人工智能-综述-12]:第九届全球软件大会(南京)有感 -1-程序员通过大模型增强自身软件研发效率的同时,也在砸自己的饭碗

目录 前言&#xff1a; 一、什么是软件工程 1.1 什么软件工程 1.2 影响软件开发效能的三大因素 1.3 AI大模型是如何提升软件工程全过程效率的 二、AI大模型如何提升软件项目管理效率 2.1 概述 2.2 案例或工具 三、AI大模型如何提升软件开发工具的效率 3.1 概述 3.2 …

JAVA 如何 改变 System.out.println(““); 的流向。

平日我们的内容都是输出在控制&#xff0c;现在小加变动&#xff0c;我们可以让他输出到文件。 package cn.cqvie.chapter01.exam1;import java.io.FileNotFoundException; import java.io.PrintStream;public class RediretOutputStream {public static void main(String[] ar…

Git GUI使用笔记

看这个视频 Git GUI基本使用_哔哩哔哩_bilibili 1 下载 Git-2.42.0.2-64Window64位安装包-最新版资源-CSDN文库 安装软件就一路next就可以 2 配置 空白处右键&#xff0c;选择Open Git Bash here &#xff0c;输入下面两行配置信息 git config --global user.name "Y…

大语言模型面试心路历程【0 offer版】

记录自己大语言模型面试的经历&#xff0c;旨在可以帮助更多想要从事此方面的小伙伴。 北银金科 1.InstructGPT的训练过程 2.critic网络的作用 3.LSTM的原理&#xff0c;GRU与LSTM有什么不同 4.讲一下Bert的结构 5.讲一下自己的论文【KBQA相关】 6.GLM的结构和微调了哪些参数 …

小程序之自定义组件 结合案例(会议OA的会议/投票管理及个人中心的搭建)详解 (4)

⭐⭐ 小程序专栏&#xff1a;小程序开发专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.前言 二.小程序自定义组件及其使用 2.1 自定义组件的使用 三.使用自定义组件完成会议功能界面的实现 3.1 导航栏的实现 3.2 会议界面内容的实现 四.投票管理界面 五.个人中心 今天…

uview组件使用笔记

图标样式 修改图标的样式 通过color参数修改图标的颜色通过size参数修改图标的大小&#xff0c;单位为rpx 效果图 <u-icon name"photo" color"#2979ff" size"28"></u-icon>图片图标 1.3.0 这里说的图片图标&#xff0c;指的是小…

7、Linux驱动开发:设备-自动创建设备节点

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

【力扣刷题】回文链表、环形链表、合并两个有序链表

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 刷题篇 一、回文链表1.1 题目描述1.2 思路分…

msvcr120.dll缺失怎么修复,快速修复msvcr120.dll丢失的三个有效方法

随着计算机技术的不断发展&#xff0c;我们在使用软件或游戏时经常会遇到各种错误提示&#xff0c;其中找不到msvcr120.dll就是一种常见的错误。那么&#xff0c;msvcr120.dll是什么&#xff1f;它的作用是什么&#xff1f;如何修复这一错误呢&#xff1f;本文将为您详细介绍几…

7.7亿参数,超越5400亿PaLM!UW谷歌提出「分步蒸馏」,只需80%训练数据|ACL 2023

LLM不实用&#xff0c;小模型蒸馏才是「现实」的大模型应用路线&#xff0c;全面领先微调技术&#xff01;土豪请无视。。。 大型语言模型虽然性能优异&#xff0c;可以用零样本或少样本提示解决新任务&#xff0c;但LLM在实际应用部署时却很不实用&#xff0c;内存利用效率低…