设计模式之备忘录模式

备忘录模式(Memento)

定义

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

使用场景

主要角色

  1. 发起人 Originator 需要备份的对象
  2. 看管人 Caretaker 保存备份的容器
  3. 备忘录 Memento 备份对象

类图

image-20240108154349260

示例代码

需要备份的对象

public class Originator {private String state1;private String state2;private String staten;void setState1(String state1) {this.state1 = state1;}String getState1() {return state1;}// 创建备忘录Memento createMemento() {Memento memento = new Memento();memento.setState1(state1);memento.setStaten(staten);return memento;}// 恢复状态void restoreMemento(Memento memento) {this.state1 = memento.getState1();this.staten = memento.getStaten();}
}

备份对象

@Data
public class Memento {private String state1;private String staten;
}

看管人:负责管理备份

public class Caretaker {private final Map<String,Memento> history = new HashMap<>();// 保存备忘录public void saveMemento(String name,Memento memento) {history.put(name,memento);}// 获取备忘录public Memento getMemento(String name) {return history.get(name);}public Memento removeMemento(String name) {return history.remove(name);}
}
public class Client {public static void main(String[] args) {// 创建发起人Originator originator = new Originator();// 创建负责人Caretaker caretaker = new Caretaker();// 设置发起人的状态originator.setState1("State 1");System.out.println("Current State: " + originator.getState1());// 保存状态caretaker.saveMemento("第一次备份", originator.createMemento());// 修改发起人的状态originator.setState1("State 2");System.out.println("Updated State: " + originator.getState1());// 恢复状态originator.restoreMemento(caretaker.getMemento("第一次备份"));System.out.println("Restored State: " + originator.getState1());}
}
Current State: State 1
Updated State: State 2
Restored State: State 1

备忘录模式与命令模式对比

  1. 两者都能实现回退与撤销操作
  2. 命令模式是通过反向命令实现的,只能逐步回退或撤销,备忘录模式生产生产当前对象的快照,可以恢复到任意备份点

工作中遇到场景

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

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

相关文章

利用chatgpt写论文使用教程

ChatGPT是人工智能技术的一种&#xff0c;可帮助人们综合运用和分析各种语言技巧&#xff0c;从而优化实验结果、加速研究流程以及提高文章质量。以下是利用ChatGPT写论文的使用教程&#xff1a; 综上所述&#xff0c;利用ChatGPT写论文涉及到一些技巧和方法&#xff0c;需要合…

API(接口) | 软件组件之间信息交互的“桥梁”

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要从 API 的定义、包含、用途和其他方面来简单地介绍 API&#xff08;接口&#xff09; ——软件组件之间信息交互的“桥梁”。 目录 一、什么是 API&#xff1f; 二、 API 中所包含哪些&#xff1f; 补充 三、API 可…

C盘中的休眠文件hiberfil.sys如何删除?

电脑休眠指整机将完全停止供电&#xff0c;而将当前处于运行状态的数据保存在硬盘中&#xff0c;下次启动的时候可以根据保存的休眠文件快速启动&#xff0c;还原上一次的电脑状态。 Win10的系统休眠文件叫作hiberfil.sys&#xff0c;它是系统休眠时临时保存的文件&#xff0c…

搜索-BFS 练习题 奇怪的电梯

奇怪的电梯 题目链接 题目描述 呵呵&#xff0c;有一天我做了一个梦&#xff0c;梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯&#xff0c;而且第 i i i 层楼&#xff08; 1 ≤ i ≤ N 1 \le i \le N 1≤i≤N&#xff09;上有一个数字 K i K_i Ki​&#xff08; 0…

Java单例模式源码剖析及使用场景

Java中常用的单例模式实现方式主要有以下几种: 饿汉式 这种方式在类加载时就完成了实例的创建,是线程安全的。 public class Singleton {private static final Singleton instance new Singleton();private Singleton() {}public static Singleton getInstance() {return i…

mac vs code 文件滑到底很多空白的解决办法

ref&#xff1a;https://stackoverflow.com/questions/1747282/how-to-make-visual-studio-editor-stop-scrolling-past-bottom-of-a-file/40588828#40588828 设置、user settings: 加入&#xff1a;"editor.scrollBeyondLastLine": false

Windows系统下使用SVN版本管理的指南

前言 版本控制对于软件开发来说至关重要&#xff0c;它不仅帮助我们管理源代码的历史记录&#xff0c;也使得多人协作变得可能。SVN&#xff08;Subversion&#xff09;是一个流行的版本控制系统&#xff0c;特别是在Windows环境中&#xff0c;通过使用如TortoiseSVN这样的客户…

oracle linux7.9(centos7.9)安装nvidia GPU显卡驱动

一.业务场景 公司服务器配置了nvidia GPU显卡&#xff0c;安装的是oracle linux7.9操作系统&#xff0c;以下是安装GPU显卡驱动的操作。 二.GPU显卡驱动的前安装步骤 1.安装前的依赖软件的安装 yum -y install epel-release kernel-devel dkms gcc备注&#xff1a;利用unam…

自己优化重写了一个定时批量自动预约茅台的系统,每天帮我全家自动预约

自己优化重写了一个定时批量自动预约茅台的系统&#xff0c;每天帮我全家自动预约&#xff0c;预约结果通过邮件推送给我&#xff0c;每天手机能收到预约结果 这里写一下思路&#xff1a; 我并不是自己重头写了这个软件&#xff0c;只是基于开源系统优化了这个软件个人使用&am…

四信全球化拓展再启新篇!LoRa传感器与云平台领航智能感知时代

随着科技浪潮的不断推进&#xff0c;物联网已逐渐融入我们的生活。刚刚结束的MWC24盛会上&#xff0c;四信带来了一系列前沿技术成果&#xff0c;不仅将5G技术成功扩展至当前市场主流类型的终端&#xff0c;更携手联通、ASR等业界巨头&#xff0c;在连接、5G RedCap、AI、LoRa以…

SpringBoot整合【RocketMQ】

目录 1.POM文件添加依赖及yml配置 2.RocketmqUtil 3.生产者&#xff08;异步发送示例&#xff09; 4.消费者 5.测试 1.POM文件添加依赖及yml配置 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter&l…

【安装教程】安装tensorflow-gpu版本

【安装教程】安装tensorflow-gpu版本 NOTE:准备工作TensorFlow安装1、 确定TensorFlow版本2、使用pip直接安装3、输入安装指令 TensorFlow安装后测试 NOTE: 如果不是首次安装tensorflow&#xff0c;卸载TensorFlow相关的内容&#xff0c;包括依赖的包&#xff08;tensorflow-e…

Base64转为图片

/*** base64转为图片* 文件路径:到文件夹即可,代码里会在文件夹里生成对应的jpg文件*/ public static String base64ToJpg(String path,String base64){String imageCode =""; if (!imageCode.equals("data:image/jpg;base64,")) {imageCode = &quo…

PokéLLMon 源码解析(六)

.\PokeLLMon\poke_env\teambuilder\teambuilder_pokemon.py """This module defines the TeambuilderPokemon class, which is used as an intermediate format to specify pokemon builds in teambuilders custom classes. """ # 导入必要的模…

存储过程:深入理解MySQL存储过程及其优势

目录 1. 创建存储过程 2. 带参数的存储过程 3. 返回值的存储过程 4. 错误处理 5. 存储过程的优势 在MySQL中&#xff0c;存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集合&#xff0c;这些语句被编译后存储在数据库服务器中&#xf…

光线追踪10 - Dielectrics( 电介质 )

水、玻璃和钻石等透明物质都属于电介质。当光线射入这些物质时&#xff0c;会分为反射光线和折射&#xff08;透射&#xff09;光线。我们将通过随机选择反射或折射来处理这一现象&#xff0c;每次相互作用只生成一条散射光线。11.1 Refraction 最难调试的部分是折射光线。通常…

铅酸废电池回收螯合树脂CH-90除镉系统

项目名称 某再生资源公司铅酸废电池回收除镉项目 工艺选择 化学沉淀系统过滤系统螯合树脂深度除镉系统 工艺原理 镉离子沉淀后进入螯合树脂除镉树脂 项目背景 铅酸蓄电池作为广泛应用的化学电源&#xff0c;凭借其电压稳定性、优异的功率性能&#xff0c;以及高性价比等…

大数据开发(Java面试真题-卷一)

大数据开发&#xff08;Java面试真题&#xff09; 1、讲一下 JVM 的垃圾回收的相关概念&#xff1f;2、JVM 常见调优方法有哪些&#xff1f;3、请解释下Java中的线程池是什么&#xff0c;如何使用线程池来提高程序的性能&#xff1f;4、请解释Java中HashMap和HashTable的区别&a…

LVS集群(Linux Virtual server)

集群概念lvs模型lvs调度算法lvs实现lvs高可用性&#xff0c;负载均衡 1 集群和分布式 系统性能扩展方式&#xff1a; Scale UP&#xff1a;垂直扩展&#xff0c;向上扩展,增强&#xff0c;性能更强的计算机运行同样的服务 升级单机的硬件设备Scale Out&#xff1a;水平扩展…

Linux Ubuntu系统安装MySQL并实现公网连接本地数据库【内网穿透】

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…