(二 十 二)趣学设计模式 之 备忘录模式!
目录
- 一、 啥是备忘录模式?
- 二、 为什么要用备忘录模式?
- 三、 备忘录模式的实现方式
- 四、 备忘录模式的优缺点
- 五、 备忘录模式的应用场景
- 六、 总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解访问者模式请看: (二 十 一)趣学设计模式 之 访问者模式!
✨更多请看个人主页: 码熔burning
这篇文章带你详细认识一下设计模式中的备忘录模式
一、 啥是备忘录模式?
想象一下,你在玩一个游戏 🎮,你打到了一个很高的分数,但是你怕后面会失误,导致分数降低 📉。 这时候,你可以保存一个游戏存档 💾,这样即使你后面失误了,也可以读档回到之前的状态 🕹️。
备忘录模式,就是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态! 简单来说,就是给对象做一个“快照”,方便以后恢复 📸。
简单来说,就是给对象创建一个“存档点”,以便在需要的时候可以“读档重来”! 💾+🕹️
- 你需要保存一个对象的内部状态,以便以后可以恢复: 就像你需要保存游戏存档,以便在失误后可以读档 🎮!
- 你不想破坏对象的封装性: 就像你不想直接访问游戏内部的数据,而是通过存档来保存状态 💾!
- 你需要支持撤销操作: 就像你需要支持游戏中的“悔棋”功能 🔙!
二、 为什么要用备忘录模式?
用备忘录模式,好处多多 👍:
- 保存状态: 可以保存对象的内部状态,方便以后恢复 💾!
- 保护封装性: 不破坏对象的封装性 🔒!
- 支持撤销: 可以支持撤销操作 🔙!
- 简化对象: 可以将复杂的对象状态存储到备忘录中,简化对象本身 🧘!
三、 备忘录模式的实现方式
备忘录模式主要包含以下几个角色:
- 发起人(Originator): 创建备忘录,并使用备忘录恢复自身状态 🕹️。
- 备忘录(Memento): 存储发起人的内部状态 💾。
- 管理者(Caretaker): 负责保存备忘录,但不检查备忘录的内容 📦。
代码示例:
// 备忘录:游戏存档
class GameMemento {private int score; // 分数private int level; // 关卡public GameMemento(int score, int level) {this.score = score;this.level = level;}public int getScore() {return score;}public int getLevel() {return level;}
}// 发起人:游戏角色
class GameRole {private int score; // 分数private int level; // 关卡public GameRole(int score, int level) {this.score = score;this.level = level;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}// 创建备忘录public GameMemento createMemento() {return new GameMemento(score, level);}// 从备忘录恢复状态public void restoreMemento(GameMemento memento) {this.score = memento.getScore();this.level = memento.getLevel();}// 显示游戏状态public void display() {System.out.println("当前分数:" + score + ",当前关卡:" + level);}
}// 管理者:存档管理器
class Caretaker {private GameMemento memento; // 备忘录public GameMemento getMemento() {return memento;}public void setMemento(GameMemento memento) {this.memento = memento;}
}// 客户端
public class Client {public static void main(String[] args) {GameRole gameRole = new GameRole(1000, 5); // 创建游戏角色gameRole.display(); // 显示游戏状态Caretaker caretaker = new Caretaker(); // 创建存档管理器caretaker.setMemento(gameRole.createMemento()); // 保存游戏存档gameRole.setScore(500); // 游戏失误,分数降低gameRole.setLevel(3); // 关卡降低gameRole.display(); // 显示游戏状态gameRole.restoreMemento(caretaker.getMemento()); // 读档gameRole.display(); // 显示游戏状态}
}
分析:
GameMemento
是备忘录,存储了游戏角色的分数和关卡。GameRole
是发起人,可以创建备忘录,并使用备忘录恢复自身状态。Caretaker
是管理者,负责保存备忘录。
输出结果:
当前分数:1000,当前关卡:5
当前分数:500,当前关卡:3
当前分数:1000,当前关卡:5
四、 备忘录模式的优缺点
优点:
- 保存状态 💾!
- 保护封装性 🔒!
- 支持撤销 🔙!
- 简化对象 🧘!
缺点:
- 增加了存储成本(需要存储备忘录) 💰!
- 管理备忘录可能会比较复杂 📦!
五、 备忘录模式的应用场景
- 需要保存一个对象的内部状态,以便以后可以恢复: 就像你需要保存游戏存档,以便在失误后可以读档 🎮!
- 需要支持撤销操作: 就像你需要支持游戏中的“悔棋”功能 🔙!
- 需要在事务管理中实现回滚操作: 就像数据库事务需要支持回滚操作 🔄!
- 需要在编辑器中实现撤销/重做功能: 就像 Word 编辑器需要支持撤销/重做功能 📝!
六、 总结
- 备忘录模式就像给对象创建一个“存档点”,以便在需要的时候可以“读档重来”! 💾+🕹️
- 优点是保存状态、保护封装性、支持撤销、简化对象! 👍
- 缺点是增加存储成本、管理备忘录复杂! 👎
- 适用于需要保存对象状态,并支持撤销操作的场景! 🎯
希望这篇文章能让你彻底理解备忘录模式! 💯 祝你学习愉快! 😄
看完请看:(二 十 三)趣学设计模式 之 解释器模式!
相关文章:

(二 十 二)趣学设计模式 之 备忘录模式!
目录 一、 啥是备忘录模式?二、 为什么要用备忘录模式?三、 备忘录模式的实现方式四、 备忘录模式的优缺点五、 备忘录模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...

交叉编译openssl及curl
操作环境:Ubuntu20.04 IDE工具:Clion2020.2 curl下载地址:https://curl.se/download/ openssl下载地址:https://openssl-library.org/source/old/index.html 直接交叉编译curl会报错找不到openssl,所以需要先交叉编…...

【每日八股】计算机网络篇(三):IP
目录 DNS 查询服务器的基本流程DNS 采用 TCP 还是 UDP,为什么?默认使用 UDP 的原因需要使用 TCP 的场景?总结 DNS 劫持是什么?解决办法?浏览器输入一个 URL 到显示器显示的过程?URL 解析TCP 连接HTTP 请求页…...

Gartner:数据安全平台DSP提升数据流转及使用安全
2025 年 1 月 7 日,Gartner 发布“China Context:Market Guide for Data Security Platforms”(《数据安全平台市场指南——中国篇》,以下简称指南),报告主要聚焦中国数据安全平台(Data Securit…...

从vue源码解析Vue.set()和this.$set()
前言 最近死磕了一段时间vue源码,想想觉得还是要输出点东西,我们先来从Vue提供的Vue.set()和this.$set()这两个api看看它内部是怎么实现的。 Vue.set()和this.$set()应用的场景 平时做项目的时候难免不会对 数组或者对象 进行这样的骚操作操作ÿ…...

深入浅出:UniApp 从入门到精通全指南
https://juejin.cn/post/7440119937644101684 uni-app官网 uniapp安卓离线打包流程_uniapp离线打包-CSDN博客 本文是关于 UniApp 从入门到精通的全指南,涵盖基础入门(环境搭建、创建项目、项目结构、编写运行)、核心概念与进阶知识&#x…...

DeepSeek未来发展趋势:开创智能时代的新风口
DeepSeek未来发展趋势:开创智能时代的新风口 随着人工智能(AI)、深度学习(DL)和大数据的飞速发展,众多创新型技术已经逐渐走向成熟,而DeepSeek作为这一领域的新兴力量,正逐步吸引越…...

阻塞队列的实现(线程案例)
一.什么是阻塞队列? 1.如果对于一个满的队列,还要把元素入队列,此时这个队列就会阻塞等待,一直阻塞到这个队列不满为止,从而把这个元素入队列! 2.如果对于一个空的队列,还要从队列拿出元素&…...

http status是什么?常见的http状态码指的是什么意思?
HTTP 状态码 HTTP 状态码(HTTP Status Code)是服务器在响应客户端请求时返回的一个三位数字代码,用于表示请求的处理结果。HTTP 状态码是 HTTP 协议的一部分,帮助客户端(如浏览器或应用程序)了解请求是否成…...

react组件分离,降低耦合
分离前 分离后...

【AI】AI白日梦+ChatGPT 三分钟生成爆款短视频
引言 随着人工智能(AI)技术的快速发展,AI在各个领域都展现出了强大的应用潜力。其中,自然语言处理技术的进步使得智能对话系统得以实现,而ChatGPT作为其中的代表之一,具有自动生成文本的能力,为…...

MYSQL的安装教程
mysql安装分为:普通安装和压缩包安装 压缩包安装很多会存在安装失败的情况,所以我这里就用了普通安装 一、官网下载安装包 www.mysql.com 点击DOWNLOADS: 进入社区版本下载: 点击最下面一行进行下载: 选择第二个离…...

深入解析 C# 中的泛型:概念、用法与最佳实践
C# 中的 泛型(Generics) 是一种强大的编程特性,允许开发者在不预先指定具体数据类型的情况下编写代码。通过泛型,C# 能够让我们编写更灵活、可重用、类型安全且性能优良的代码。泛型广泛应用于类、方法、接口、委托、集合等多个方…...

NUMA架构介绍
NUMA 架构详解 NUMA(Non-Uniform Memory Access,非统一内存访问) 是一种多处理器系统的内存设计架构,旨在解决多处理器系统中内存访问延迟不一致的问题。与传统的 UMA(Uniform Memory Access,统一内存访问…...

数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南
文章目录 数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南ChatGPTKimi腾讯元宝DeepSeek 数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南 产品隐私设置操作路径隐私协议ChatGPT…...

python爬虫:python中使用多进程、多线程和协程对比和采集实践
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 多进程爬虫1.1 python多进程样例1.2 实现多进程爬虫2. 多线程爬虫2.1 python多线程样例2.2 实现多线程爬虫3. 协程爬虫3.1 python协程样例3.2 实现协程爬虫在网络爬虫中,为了提高抓取效率,常常需要使用多进程、多线…...

《OpenCV》—— dlib库
文章目录 dlib库是什么?OpenCV库与dlib库对比dlib库安装dlib——人脸应用实例——人脸检测dlib——人脸应用实例——人脸关键点定位dlib——人脸应用实例——人脸轮廓绘制 dlib库是什么? OpenCV库与dlib库对比 dlib库安装 dlib——人脸应用实例——人脸检…...

Linux搜索---find
find搜索 find 命令的核心功能是在指定的目录路径下,递归地搜索文件和目录,并且可以根据多种条件对搜索结果进行筛选,还能对符合条件的文件和目录执行特定操作。 一、基础语法结构 find [起始目录] [匹配条件] [执行操作] # 基本示例 find…...

python之爬虫入门实例
链家二手房数据抓取与Excel存储 目录 开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备 1.1 必要组件安装 # 安装核心库 pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明: - requests&#x…...

Blender常用快捷键的汇总
一、基础操作 全选/取消全选:A(全选)、AA(连续按两次A取消全选)复制物体:Shift D(复制后需点击确认位置)移动物体:G(按X/Y/Z可约束轴向移动)旋转…...

鸿蒙启动页开发
鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件,找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…...

Unity 文字高度自适应
期望 文字有字号限制,输入文字文字后先判断高度是否适用于限制字号,若处于最小字号时高度任不适用,则调整RectTransform 的高度。 核心代码 每次输入文字时先将字号设定为原始字号。 comp.fontSize fontSize; comp.text content; 拓展T…...

Teaching Small Language Models Reasoning throughCounterfactual Distillation
2024.emnlp-main.333.pdfhttps://aclanthology.org/2024.emnlp-main.333.pdf 1.概述 大型语言模型(LLM),如GPT-3,在各种下游任务中表现出色,包括通过链式思维(CoT)进行问题解答。CoT鼓励模型在解决问题时生成中间推理步骤。尽管LLM取得了成功,但由于模型大小的限制,其…...

快速开始React开发(一)
快速开始React开发(一) React是一个JavaScript库,用于构建交互式网站,并且能够快捷创建SPA(Single Page App),其组件化的思想也是被一再传播,无论是普通的Web网站还是嵌入移动端交互…...

2025最新Transformer模型及深度学习前沿技术应用
第一章、注意力(Attention)机制 1、注意力机制的背景和动机(为什么需要注意力机制?注意力机制的起源和发展里程碑)。 2、注意力机制的基本原理(什么是注意力机制?注意力机制的数学表达与基本公…...

极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...

[环境搭建篇] Windows 环境下如何安装Docker工具
Windows 环境下如何安装Docker工具 1. 检查系统要求2. 启用WSL 2和虚拟化步骤一:启用WSL步骤二:启用虚拟化(Hyper-V)步骤三:安装WSL 2内核 3. 安装Docker Desktop4. 配置Docker5. 家庭版用户替代方案6. 常见问题解决问…...

JavaScript 数组和字符串方法详解
一、数组方法 数组方法是操作数组的核心工具,分为修改原数组和返回新数组两类。 1. 常用修改原数组的方法 方法参数返回值说明示例push...items新长度末尾添加元素arr.push(4) → [1,2,3,4]pop无删除的元素删除最后一个元素arr.pop() → 3(原数组变[1,…...

达梦数据库系列之Mysql项目迁移为达梦项目
达梦数据库系列之Mysql项目迁移为达梦项目 1 达梦数据库安装及MySql数据迁移2 SpringBoot项目迁移2.1 驱动包引入2.2 驱动类配置2.3 数据源配置2.4 flowable迁移2.4.1 异常问题2.4.2 解决 3 迁移常见问题3.1 不是 GROUP BY 表达式3.1.1 dm.ini 开启Mysql兼容模式3.1.2 修改动态…...

10个实用IntelliJ IDEA插件
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是为提升开发效率推荐的10个实用IntelliJ IDEA插件,涵盖代码质量、效率工具及热门框架支持: 一、代码质量与规范 SonarLint 实时…...