03-JAVA设计模式-备忘录模式

备忘录模式

什么是备忘录模式

Java中的备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。

主要角色包括:

  • 发起者(Originator):需要保存和恢复状态的对象。它记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,并可以访问备忘录里的所有信息。
  • 备忘录(Memento):负责存储发起人的内部状态。它是一个临时中间对象,用于存储目标对象的初始相关属性信息。当需要恢复对象的状态时,备忘录提供这些内部状态给发起人。
  • 看护者(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改。

优点:

  • 状态保存与恢复:备忘录模式可以方便地保存和恢复对象的状态,使得对象的状态变化具有可追溯性。
  • 封装性:通过将对象的状态封装在备忘录对象中,备忘录模式可以保持对象的封装性,不会暴露内部状态给外部对象。
  • 简化撤销和重做操作:在需要实现撤销、重做等功能的场景中,备忘录模式可以大大简化操作,提高代码的清晰度和可维护性。

缺点:

  • 资源消耗:如果对象的状态较为复杂或状态变化频繁,备忘录模式可能会消耗较多的内存资源来保存状态。
  • 性能开销:频繁地创建和销毁备忘录对象可能会导致一定的性能开销。
  • 设计复杂性:如果对象的状态需要保密或访问权限受限,备忘录模式可能会增加设计的复杂性,并可能破坏对象的封装性。

常见应用场景:

  • 文本编辑器:在文本编辑器中,备忘录模式可以用于实现撤销和重做功能。当用户编辑文本时,编辑器可以定期保存文本状态到备忘录对象中。当用户需要撤销或重做操作时,编辑器可以恢复或重新应用这些状态。
  • 游戏存档:在电子游戏中,备忘录模式可以用于实现游戏的存档功能。当玩家选择保存游戏时,游戏可以将当前的游戏状态(如玩家位置、分数、物品等)保存到备忘录对象中。当玩家再次加载游戏时,游戏可以从备忘录对象中恢复状态,让玩家继续之前的游戏进度。
  • 数据库事务:在数据库操作中,备忘录模式可以用于实现事务的回滚功能。当执行一系列数据库操作时,可以将数据库的状态保存到备忘录对象中。如果事务执行失败或需要回滚,可以恢复到之前的状态。

案例

java实现控制台输入内容的回退

UML

在这里插入图片描述

实现步骤:

  • 创建发起者ScannerInput,定义保存输入内容字段input
  • 创建备忘录继承发起者,主要继承发起者的属性及get/set方法不再重复提供,提供创建备忘录及通过备忘录恢复状态的方法
  • 创建看护者,定义栈对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改

实现代码

ScannerInput.java

// 发起者
public class ScannerInput {// 输入内容protected String input;public ScannerInput(String input) {this.input = input;}public String getInput() {return input;}public void setInput(String input) {this.input = input;}
}

Originator.java

// 备忘录
//  继承发起者,主要继承发起者的属性及get/set方法不再重复提供
//  提供创建备忘录及通过备忘录恢复状态的方法
public class Originator extends ScannerInput{public Originator(String input) {super(input);}// 创建备忘录public ScannerInput createMemento() {return new ScannerInput(this.input);}// 恢复public void restoreMemento(ScannerInput scannerInput) {this.input = scannerInput.getInput();}
}

Caretaker.java

import java.util.Stack;// 看护者
// * 对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改。
public class Caretaker {// 定义栈管理备忘录private Stack<ScannerInput> stack = new Stack<ScannerInput>();// 压栈public void setScannerInput(ScannerInput scannerInput) {stack.push(scannerInput);}// 出栈public ScannerInput getScannerInput() {if(stack.size() == 0){System.out.println("已经不可以回退啦!");}return stack.pop();}
}

TestClient.java

import java.util.Scanner;public class TestClient {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一些文本,输入'exit'退出:");// 创建原发器对象并设置默认内容Originator originator = new Originator("");// 创建并保存备忘录Caretaker caretaker = new Caretaker();// 初始化压栈caretaker.setScannerInput(originator.createMemento());while (true) {String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {System.out.printf("你输入了:%s%n" , input);break;}// 回退操作else if ("back".equalsIgnoreCase(input)) {// 回退originator.restoreMemento(caretaker.getScannerInput());System.out.printf("回退上一步-你输入:%s%n 输入:back(回退上一步) exit(退出)%n" , originator.getInput());} else {// 设置内容originator.setInput(input);// 设置备忘录caretaker.setScannerInput(originator.createMemento());System.out.printf("你输入了:%s%n 输入:back(回退上一步) exit(退出)%n" , originator.getInput());}}scanner.close();System.out.println("已退出。");}
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

Idea:阿里巴巴Java编码插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Alibaba Java Coding …

【AI】Deepstream入门(2)Ubuntu20.04安装Deepstream

1、安装GPU驱动 本人显卡型号:RTX4060 Laptop(笔记本专用显卡) 【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动 2、安装cuda、cuDNN 【AI】Ubuntu20.04安装cuda、cuDNN 3、安装TensorRT 1)下载 下载地址:https://docs.nvidia.com/deeplearning/tensorrt/archives/i…

用于肺结节分类的常规 EHR 的纵向多模态Transformer集成成像和潜在临床特征

Longitudinal Multimodal Transformer Integrating Imaging and Latent Clinical Signatures from Routine EHRs for Pulmonary Nodule Classification 摘要 该研究提出了一种基于Transformer 的多模态策略&#xff0c;用于将重复成像与常规电子健康记录&#xff08;EHRs&…

低空经济概念

低空经济是指利用低空空域资源&#xff0c;通过低空交通工具和技术创新发展&#xff0c;促进航空产业、旅游、物流、紧急救援等多领域经济增长和产业融合。随着科技的不断进步和航空产业的快速发展&#xff0c;低空经济正逐渐成为全球经济的重要组成部分。 一、低空经济的主要特…

「珞石机器人」完成超5亿元战略+轮融资

珞石机器人ROKAE. 新一代智能机器人专家 近日&#xff0c;襄禾资本投资企业「珞石机器人」宣布完成超5亿元的战略轮融资&#xff0c;本次融资获得了国家制造业转型升级基金和邹城市新动能产业投资基金的共同加持&#xff0c;资金将主要用于市场开发、国际化开拓、产品升级迭代…

【【gitlab解决git Clone 出现 Permission denied, please try again.】】

【gitlab解决git Clone 出现 Permission denied, please try again.】 问题解决随便找一个地方 点击右键输入ssh -keygen -C "邮件"显示结果输入 登录gitlab然后再次git Clone就可以了。 问题 git clone的时候出现 Permission denied, please try again 解决 随便…

怎么使用下载视频号视频?详细视频下载使用教程

越来越多的人开始使用视频号等平台来分享和观看视频内容。然而&#xff0c;有时候我们可能会遇到需要将视频保存到本地设备以便离线观看或进一步编辑的情况。 本文将为您详细介绍如何使用视频下载plus&#xff0c;来下载视频号的视频内容。 一、了解视频号下载功能 首先&…

http忽略ssl认证

我们在发请求时&#xff0c;会遇到需要ssl证书验证的报错&#xff0c;针对该错误以及所使用的不同的创建连接的方式&#xff0c;进行ssl证书忽略 忽略SSL证书的流程 简介&#xff1a;需要告诉client使用一个不同的TrustManager。TrustManager是一个检查给定的证书是否有效的类…

【可下载】CDA 1级教材《精益业务数据分析》2023最新版

CDA一级认证教材&#xff1a;《精益业务数据分析》 全面、系统地讲述业务描述性分析为企业决策行为创造价值的全流程技能&#xff0c;涵盖描述性数据分析方法、业务分析方法、数据分析结果应用方法等内容。 条理清晰的结构、通俗易懂的语言、完整立体的知识框架为读者铺开一幅…

python逆向基础流程(纯小白教程)

一&#xff0c;例题链接 NSSCTF | 在线CTF平台 二&#xff0c;文件特征 使用工具查看文件信息&#xff0c;发现是pyinsatller打包的exe文件&#xff0c;如果硬用ida分析成汇编或c语言根本摸清楚程序的逻辑&#xff0c;所以思路是反编译成py文件直接分析python代码 三&#xf…

【go零基础】go-zero从零基础学习到实战教程 - 2项目初始化

到项目初始化过程了&#xff0c;这边的项目设计完全按照作者自己的喜好来进行定义和设置的&#xff0c;所以各位完全可以按照自己的偏好自喜设置哈。 首先是创建一个工作文件夹哈。 别问为啥不直接quickstart&#xff0c;因为quickstart生成的api名字是greet&#xff0c;改起来…

【EMQX】使用websocket订阅EMQX数据

需求&#xff1a;某平台希望通过 websocket 来订阅 EMQX平台上的某些 Topic数据进行处理 1、EMQX 服务配置 前提是EMQX服务正常安装运行了&#xff0c;如果EMQX服务未安装的话&#xff0c;详见以下文章关于如何安装部署服务&#xff1a; 搭建自己的MQTT服务器、实现设备上云(W…

uniapp-css:拼图(不规则图片拼插)、碎片

拼图案例样式 高斯模糊的地方可以对应的使用fliter属性和opacity来调节样式。 其余碎片和图片对应: 这段代码实现了一个拼图效果的Vue组件。以下是对代码的详细解析: 模板部分: 在模板中使用v-for指令遍历imgs数组中的每个图片对象,为每个图片创建一个元素。 使用:cla…

实验一: 设备密码配置与远程管理

1.实验环境 用路由器和交换机搭建实验环境 2.需求描述 实现管理员主机对交换机和路由器的远程管理 设备上配置的密码都要被加密 3.推荐步骤 对路由器配置的步骤如下&#xff1a; 实现路由器和PC的连通性配置VTY密码和特权模式密码在PC上Telnet 到路由器。 对交换机配置的…

柏曼和琪朗护眼灯哪个好?书客、柏曼、琪朗护眼大路灯横测

护眼大路灯是一种备受用户认可的照明电器&#xff0c;但是市面上众多大路灯品牌的评价都良莠不齐&#xff0c;外观几乎清一色的大路灯在品质上却有着很大的区别&#xff0c;很多朋友想要入手但是却迟迟不敢下手。那么&#xff0c;怎么才能买到性能优越、各方面又出色的大路灯呢…

JAVA实现easyExcel模版导出

easyExcel文档 模板注意&#xff1a; 用 {} 来表示你要用的变量 &#xff0c;如果本来就有"{“,”}" &#xff0c;特殊字符用"{“,”}"代替{} 代表普通变量{.}代表是list的变量 添加pom依赖 <dependency><groupId>com.alibaba</groupId&g…

MyPerf4J:一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具。

试用效果&#xff1a; git地址&#xff1a;https://github.com/LinShunKang/MyPerf4J 下载&#xff1a; https://github.com/LinShunKang/Objects/blob/master/zips/CN/MyPerf4J-ASM-3.4.0-SNAPSHOT.zip?rawtrue 配置&#xff1a; # 配置监控应用的名称 app_name MyApp#…

半导体晶圆厂内外网数据单向导出,什么样的方案才安全又便捷?

半导体晶圆厂企业为了隔绝外部⽹络有害攻击、保护⽹络和数据安全&#xff0c;通常采⽤物理隔离的⽅式&#xff0c;将企业内⽹与互联⽹隔离。⽹络隔离后&#xff0c;基于业务开展需求&#xff0c;部分重要数据仍需由内⽹导⼊及导出⾄外部⽹络区域。为保障数据的安全合规性&#…

数据结构--删除单链表中的某一个节点(时间复杂度控制为O(1))

题目描述&#x1f357; 只给定单链表中某个结点p(并非最后一个结点&#xff0c;即p->next!NULL)指针&#xff0c;删除该结点 思路分析&#x1f357; 结点不重要&#xff0c;&#xff0c;重要的是数据 不删自己&#xff0c;删除后面的结点: 1.把后面结点数据复制到当前 2.…

stm32——GPIO学习

对于许多刚入门stm32的同学们来说&#xff0c;GPIO是我们的第一课&#xff0c;初出茅庐的我们会对GPIO的配置感到疑惑不解&#xff0c;也是劝退我们的第一课&#xff0c;今天我们就来一起学习一下stm32的GPIO&#xff0c;提振一下信心。好的&#xff0c;发车了小卷卷们&#xf…