【设计模式|行为型】备忘录模式(Memento Pattern)
说明
备忘录模式是一种行为型设计模式,通过捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时恢复对象到原先的状态。备忘录模式包含三个核心角色:。
- 发起人(Originator):负责创建一个备忘录,并记录当前对象的内部状态到备忘录中。
- 备忘录(Memento):负责存储发起人对象的内部状态,提供给发起人对象恢复内部状态的方法。
- 负责人(Caretaker):负责保存备忘录,可以使用备忘录来回滚对象的状态。
备忘录模式的核心思想是将对象的状态保存在一个独立的对象中,以便以后恢复。通过使用备忘录模式,我们可以轻松地实现对象状态的保存和恢复,同时也提高了系统的可维护性和扩展性。
优点
- 它提供了一种可以在不破坏封装性的情况下恢复对象状态的方法。
- 它简化了发起人对象的设计,避免了复杂的状态管理。
- 它可以在不影响客户端的情况下实现对象的历史记录和撤销操作。
缺点
- 需要消耗一定的内存空间来存储备忘录对象。
- 如果发起人对象的状态非常庞大,那么备忘录对象的存储和恢复操作可能会很昂贵。
使用场景
- 需要保存和恢复对象状态的场景,例如游戏中的存档功能、文档编辑器的撤销和恢复功能等。
- 需要提供对象的历史记录和撤销功能的场景,例如文本编辑器中的编辑历史记录、Web浏览器中的前进和后退功能等。
示例
下面以一个游戏存档的例子来说明备忘录模式的实现。
首先,我们定义游戏类Game,其中包含当前游戏的状态信息和对状态进行修改和恢复的方法:
public class Game {private String level;private int score;public Game(String level, int score) {this.level = level;this.score = score;}public String getLevel() {return level;}public void setLevel(String level) {this.level = level;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public void printStatus() {System.out.println("当前游戏状态:level=" + level + ", score=" + score);}// 创建备忘录public Memento createMemento() {return new Memento(level, score);}// 从备忘录中恢复状态public void restoreMemento(Memento memento) {this.level = memento.getLevel();this.score = memento.getScore();}
}
然后,我们定义备忘录类Memento,用于存储游戏状态:
public class Memento {private String level;private int score;public Memento(String level, int score) {this.level = level;this.score = score;}public String getLevel() {return level;}public int getScore() {return score;}
}
最后,我们定义管理者类Caretaker,用于保存游戏状态的备忘录,并支持回溯和恢复操作:
import java.util.Stack;public class Caretaker {private Stack<Memento> mementoStack = new Stack<>();// 保存当前状态public void save(Game game) {mementoStack.push(game.createMemento());}// 回溯到上一个状态public void undo(Game game) {if (!mementoStack.isEmpty()) {game.restoreMemento(mementoStack.pop());}}// 恢复到最初状态public void reset(Game game) {mementoStack.clear();game.setLevel("简单");game.setScore(0);}
}
现在,我们可以创建游戏对象、备忘录对象和管理者对象,进行游戏状态的保存、回溯和恢复:
public class MementoExample {public static void main(String[] args) {// 创建游戏对象Game game = new Game("简单", 0);// 创建管理者对象Caretaker caretaker = new Caretaker();// 保存当前状态caretaker.save(game);// 改变游戏状态game.setLevel("普通");game.setScore(100);// 保存当前状态caretaker.save(game);// 改变游戏状态game.setLevel("困难");game.setScore(200);// 保存当前状态caretaker.save(game);// 回溯到上一个状态caretaker.undo(game);game.printStatus(); // 当前游戏状态:level=普通, score=100// 回溯到最初状态caretaker.reset(game);game.printStatus(); // 当前游戏状态:level=简单, score=0}
}
现在,我们可以创建游戏对象、备忘录对象和管理者对象,进行游戏状态的保存、回溯和恢复:
当前游戏状态:level=普通, score=100
当前游戏状态:level=简单, score=0
相关文章:
【设计模式|行为型】备忘录模式(Memento Pattern)
说明 备忘录模式是一种行为型设计模式,通过捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时恢复对象到原先的状态。备忘录模式包含三个核心角色:。 发起人(Originator):负责…...
Redis与其他缓存解决方案(如Memcached)的区别是什么?
Redis和其他缓存解决方案(如Memcached)在设计理念、功能和特点上有一些区别,以下是它们的主要区别: 数据类型支持:Redis支持多种数据类型(如字符串、哈希表、列表、集合、有序集合等)࿰…...
《面试1v1》Kafka的ack机制
🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结…...
基于双 STM32+FPGA 的桌面数控车床控制系统设计
桌 面数控 设 备 对 小 尺寸零件加工在成 本 、 功 耗 和 占 地 面 积等方 面有 着 巨 大 优 势 。 桌 面数控 设 备 大致 有 3 种 实 现 方 案 : 第 一种 为 微 型 机 床搭 配 传统 数控系 统 , 但 是 桌 面数控 设 备 对 成 本 敏感 ; 第二 种 为 基 于 PC…...
ES-5-进阶
单机 & 集群 单台 Elasticsearch 服务器提供服务,往往都有最大的负载能力,超过这个阈值,服务器 性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中 配置服务器集群时,集…...
Java面试准备篇:全面了解面试流程与常见问题
文章目录 1.1 Java面试概述1.2 面试流程和注意事项1.3 自我介绍及项目介绍1.4 常见面试问题 在现代职场中,面试是求职过程中至关重要的一环,特别是对于Java开发者而言。为了帮助广大Java开发者更好地应对面试,本文将提供一份全面的Java面试准…...
Go语言进阶语法八万字详解,通俗易懂
文章目录 File文件操作FileInfo接口权限打开模式File操作文件读取 I/O操作io包 文件复制io包下的Read()和Write()io包下的Copy()ioutil包总结 断点续传Seeker接口断点续传 bufio包bufio包原理Reader对象Writer对象 bufio包bufio.Readerbufio.Writer ioutil包ioutil包的方法示例…...
Apache RocketMQ 远程代码执行漏洞(CVE-2023-37582)
漏洞简介 Apache RocketMQ是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。CVE-2023-37582 中,由于对 CVE-2023-33246 修复不完善,导致在Apache RocketMQ NameServer 存在未授权访问的情况下,攻击者可构造恶意请求以RocketMQ运…...
Kotlin Multiplatform 使用 CocoaPods 创建多平台分发库
Kotlin Multiplatform 支持直接创建Framework 方式和使用CocoaPods 方式创建Framework。 1、不同之处在于创建的时候需要选择不同的方式。 2、使用CocoaPods 方式还需要在 build.gradle(.kts) 文件中添加内容 在build.gradle(.kts) 文件中添加完成后,执行一下文件。…...
前端食堂技术周刊第 92 期:VueConf 2023、TypeChat、向量数据库、Nuxt 服务器组件指南
美味值:🌟🌟🌟🌟🌟 口味:整颗牛油果酸奶 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先…...
用C语言构建一个手写数字识别神经网络
(原理和程序基本框架请参见前一篇 "用C语言构建了一个简单的神经网路") 1.准备训练和测试数据集 从http://yann.lecun.com/exdb/mnist/下载手写数字训练数据集, 包括图像数据train-images-idx3-ubyte.gz 和标签数据 train-labels-idx1-ubyte.…...
vue关闭ESlint
在 vue.config.js里边写上这一句代码 lintOnsave:false写完后重启一下项目...
测试开发人员如何进行局部探索性测试?一张图告诉你
我们都知道全局探索性测试的漫游测试法,也知道局部探索性测试可以从用户输入、状态、代码路径、用户数据和执行环境测试着手点。 那么,如果我们能够获取开发代码,我们怎么从代码入手,进行具体的局部探索性测试呢? 简单…...
CentOS 8 上安装 Nginx
Nginx是一款高性能的开源Web服务器和反向代理服务器,以其轻量级和高效能而广受欢迎。在本教程中,我们将学习在 CentOS 8 操作系统上安装和配置 Nginx。 步骤 1:更新系统 在安装任何软件之前,让我们先更新系统的软件包列表和已安…...
【c语言进阶】字符函数和字符串函数知识总结
字符函数和字符串函数 前期背景求字符串长度函数strlen函数strlen函数三种模拟实现 长度不受限制的字符串函数strcpy函数strcpy函数模拟实现strcat函数strcat函数模拟实现strcmp函数strcmp函数模拟实现 长度受限制的字符串函数strncpy函数strncpy函数模拟实现strncat函数strnca…...
DB2实现正则表达式
DB2实现正则表达式 功能描述 db2 11.1 及以上版本支持正则表达式,但是db2 10.5及以下版本不支持正则表达式,需要手工创建正则表达式函数。 安装与卸载步骤 README.txt2010-07-30IBM IMTE - Project AvalancheAuthor: Alexandre GrancherThis file des…...
CASS数据带属性转GIS的shp数据教程
一、数据:DWG文件中含有JZD(宗地层),JZP(界址点层),其中JZP中含有界址点号,实现JZD层转成ZD的shp数据;JZP转成JZD点的shp数据,并带出界址点号。 二、实现原理…...
Jenkins配置自动化构建的几个问题
在创建构建任务时,填写git远程仓库地址时,出现以下报错 解决此报错先排查一下linux机器上的git版本 git --version 如果git 版本过低,可能会导致拉取失败,此时需要下载更高的git版本。 参考 Git安装 第二个解决办法报错信息中…...
ubuntu 命令调节显示器亮度
1.显示器名字 xrandr -q | grep " connected" HDMI-0 connected primary 1920x108000 (normal left inverted right x axis y axis) 527mm x 297mm DP-4 connected 1920x108019200 (normal left inverted right x axis y axis) 527mm x 297mm 2.调节亮度 xrandr --ou…...
打卡力扣题目七
#左耳听风 ARST 打卡活动重启# 目录 一、题目 二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share:…...
DeepSeek系统设计辅助:如何在48小时内完成可审计、可回滚、可压测的AI服务架构图?
更多请点击: https://intelliparadigm.com 第一章:DeepSeek系统设计辅助 DeepSeek系统设计辅助模块面向架构师与后端工程师,提供模型能力调用、接口契约生成、异步任务编排等核心支撑能力。该模块不替代人工设计决策,而是通过结构…...
Redis分布式锁进阶第二十篇
一、本篇前置衔接 第二十篇我们完成了全系列终局复盘,整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透,但真实复杂业务永远不是单一资源:下单要扣库存、扣优惠券、扣积分、冻结余额,多资源并行争抢…...
解决Claude Code访问不稳定与Token不足的痛点
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决Claude Code访问不稳定与Token不足的痛点 许多开发者将Claude Code作为日常编程的得力助手,用于代码生成、问题调试…...
PCL 法向量夹角剔除错误匹配点对【2026最新版】
目录 一、 算法简介 1、主要函数 2、参考文献 二、 代码实现 三、 结果展示 四、 参考链接 博客长期更新,本文最新更新时间为:2026年5月24日。代码在PCL1.15.1中测试通过 一、 算法简介 在三维点云配准中,对应点(correspondence)的准确性直接决定了配准算法的精度和鲁棒性…...
ZTE光猫工厂模式解锁:5分钟开启隐藏功能的终极指南
ZTE光猫工厂模式解锁:5分钟开启隐藏功能的终极指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 核心关键词:ZTE光猫工厂模式解锁 长尾关键词: ZT…...
通过curl命令快速测试Taotoken大模型API的连通性与返回格式
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken大模型API的连通性与返回格式 在集成大模型能力到应用时,开发者通常需要一种快速、轻量的…...
【DeepSeek漏洞扫描辅助实战指南】:20年安全专家亲授3大避坑法则与5步提效流程
更多请点击: https://intelliparadigm.com 第一章:DeepSeek漏洞扫描辅助的核心价值与适用边界 DeepSeek漏洞扫描辅助并非通用型渗透测试引擎,而是一个聚焦于大语言模型(LLM)应用层安全的轻量级分析工具。其核心价值在…...
Git Bash 中无法启动 Claude Code ?
最近需要在 git bash 中跑 Claude Code 。git bash 是随 git for windows 套件安装的,很久没更新了,结果启动 Claude Code 报错:Warning: no stdin data received in 3s, proceeding without it. If piping from a slow command, redirect st…...
Jetson Orin上TVA模型DLA精准卸载配置
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
DLA功耗优化验证:tegrastats实战指南
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
