当前位置: 首页 > news >正文

【设计模式|行为型】备忘录模式(Memento Pattern)

说明

备忘录模式是一种行为型设计模式,通过捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时恢复对象到原先的状态。备忘录模式包含三个核心角色:。

  1. 发起人(Originator):负责创建一个备忘录,并记录当前对象的内部状态到备忘录中。
  2. 备忘录(Memento):负责存储发起人对象的内部状态,提供给发起人对象恢复内部状态的方法。
  3. 负责人(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)

说明 备忘录模式是一种行为型设计模式&#xff0c;通过捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;以便在需要时恢复对象到原先的状态。备忘录模式包含三个核心角色&#xff1a;。 发起人&#xff08;Originator&#xff09;&#xff1a;负责…...

Redis与其他缓存解决方案(如Memcached)的区别是什么?

Redis和其他缓存解决方案&#xff08;如Memcached&#xff09;在设计理念、功能和特点上有一些区别&#xff0c;以下是它们的主要区别&#xff1a; 数据类型支持&#xff1a;Redis支持多种数据类型&#xff08;如字符串、哈希表、列表、集合、有序集合等&#xff09;&#xff0…...

《面试1v1》Kafka的ack机制

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…...

基于双 STM32+FPGA 的桌面数控车床控制系统设计

桌 面数控 设 备 对 小 尺寸零件加工在成 本 、 功 耗 和 占 地 面 积等方 面有 着 巨 大 优 势 。 桌 面数控 设 备 大致 有 3 种 实 现 方 案 : 第 一种 为 微 型 机 床搭 配 传统 数控系 统 &#xff0c; 但 是 桌 面数控 设 备 对 成 本 敏感 ; 第二 种 为 基 于 PC…...

ES-5-进阶

单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器 性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中 配置服务器集群时&#xff0c;集…...

Java面试准备篇:全面了解面试流程与常见问题

文章目录 1.1 Java面试概述1.2 面试流程和注意事项1.3 自我介绍及项目介绍1.4 常见面试问题 在现代职场中&#xff0c;面试是求职过程中至关重要的一环&#xff0c;特别是对于Java开发者而言。为了帮助广大Java开发者更好地应对面试&#xff0c;本文将提供一份全面的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 中&#xff0c;由于对 CVE-2023-33246 修复不完善&#xff0c;导致在Apache RocketMQ NameServer 存在未授权访问的情况下&#xff0c;攻击者可构造恶意请求以RocketMQ运…...

Kotlin Multiplatform 使用 CocoaPods 创建多平台分发库

Kotlin Multiplatform 支持直接创建Framework 方式和使用CocoaPods 方式创建Framework。 1、不同之处在于创建的时候需要选择不同的方式。 2、使用CocoaPods 方式还需要在 build.gradle(.kts) 文件中添加内容 在build.gradle(.kts) 文件中添加完成后&#xff0c;执行一下文件。…...

前端食堂技术周刊第 92 期:VueConf 2023、TypeChat、向量数据库、Nuxt 服务器组件指南

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;整颗牛油果酸奶 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先…...

用C语言构建一个手写数字识别神经网络

(原理和程序基本框架请参见前一篇 "用C语言构建了一个简单的神经网路") &#xff11;&#xff0e;准备训练和测试数据集 从http://yann.lecun.com/exdb/mnist/下载手写数字训练数据集, 包括图像数据train-images-idx3-ubyte.gz 和标签数据 train-labels-idx1-ubyte.…...

vue关闭ESlint

在 vue.config.js里边写上这一句代码 lintOnsave:false写完后重启一下项目...

测试开发人员如何进行局部探索性测试?一张图告诉你

我们都知道全局探索性测试的漫游测试法&#xff0c;也知道局部探索性测试可以从用户输入、状态、代码路径、用户数据和执行环境测试着手点。 那么&#xff0c;如果我们能够获取开发代码&#xff0c;我们怎么从代码入手&#xff0c;进行具体的局部探索性测试呢&#xff1f; 简单…...

CentOS 8 上安装 Nginx

Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;以其轻量级和高效能而广受欢迎。在本教程中&#xff0c;我们将学习在 CentOS 8 操作系统上安装和配置 Nginx。 步骤 1&#xff1a;更新系统 在安装任何软件之前&#xff0c;让我们先更新系统的软件包列表和已安…...

【c语言进阶】字符函数和字符串函数知识总结

字符函数和字符串函数 前期背景求字符串长度函数strlen函数strlen函数三种模拟实现 长度不受限制的字符串函数strcpy函数strcpy函数模拟实现strcat函数strcat函数模拟实现strcmp函数strcmp函数模拟实现 长度受限制的字符串函数strncpy函数strncpy函数模拟实现strncat函数strnca…...

DB2实现正则表达式

DB2实现正则表达式 功能描述 db2 11.1 及以上版本支持正则表达式&#xff0c;但是db2 10.5及以下版本不支持正则表达式&#xff0c;需要手工创建正则表达式函数。 安装与卸载步骤 README.txt2010-07-30IBM IMTE - Project AvalancheAuthor: Alexandre GrancherThis file des…...

CASS数据带属性转GIS的shp数据教程

一、数据&#xff1a;DWG文件中含有JZD&#xff08;宗地层&#xff09;&#xff0c;JZP&#xff08;界址点层&#xff09;&#xff0c;其中JZP中含有界址点号&#xff0c;实现JZD层转成ZD的shp数据&#xff1b;JZP转成JZD点的shp数据&#xff0c;并带出界址点号。 二、实现原理…...

Jenkins配置自动化构建的几个问题

在创建构建任务时&#xff0c;填写git远程仓库地址时&#xff0c;出现以下报错 解决此报错先排查一下linux机器上的git版本 git --version 如果git 版本过低&#xff0c;可能会导致拉取失败&#xff0c;此时需要下载更高的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&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share:…...

【 Claw-Code】 技术深度解析:Claude Code Agent Harness 的开源重实现

文章目录Claw-Code 技术深度解析&#xff1a;Claude Code Agent Harness 的开源重实现一、引言二、项目背景与定位2.1 为什么是"洁室重实现"2.2 项目核心目标三、双语言架构设计3.1 双语言实现对比3.2 Rust Workspace 模块划分四、核心组件解析4.1 运行时&#xff08…...

复古计算机复兴:OpenClaw+Qwen3-14B驱动命令行工作流

复古计算机复兴&#xff1a;OpenClawQwen3-14B驱动命令行工作流 1. 当AI遇见Unix哲学 我的书桌上至今保留着一台1984年的IBM PC/AT&#xff0c;那厚重的机械键盘和闪烁的绿色光标总能唤起某种仪式感。最近在调试OpenClaw对接Qwen3-14B时&#xff0c;突然意识到&#xff1a;我…...

抖音视频批量下载终极指南:5分钟掌握免费去水印技巧

抖音视频批量下载终极指南&#xff1a;5分钟掌握免费去水印技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

嵌入式字符LCD进度条库:LcdProgressBar轻量实现

1. 项目概述LcdProgressBar是一个面向嵌入式 LCD 显示场景的轻量级进度条绘制库&#xff0c;专为基于字符型液晶显示屏&#xff08;Character LCD&#xff09;的资源受限系统设计。其核心定位并非替代图形 LCD 的矢量渲染能力&#xff0c;而是以极低内存开销和确定性执行时间&a…...

C++的std--filesystem文件系统库与跨平台路径处理的标准化

C的std::filesystem文件系统库与跨平台路径处理的标准化 在现代软件开发中&#xff0c;跨平台文件系统操作一直是一个复杂且容易出错的挑战。不同操作系统&#xff08;如Windows、Linux和macOS&#xff09;使用不同的路径分隔符和文件系统语义&#xff0c;开发者往往需要编写大…...

MCP3302/MCP3304 13位差分ADC驱动开发与硬件协同设计指南

1. MCP330X库深度解析&#xff1a;面向嵌入式工程师的13位差分ADC驱动开发指南MCP330X系列Arduino库是专为Microchip MCP3302与MCP3304高精度模数转换器设计的底层驱动框架。该库并非简单封装&#xff0c;而是基于对SPI协议时序、ADC采样原理及嵌入式资源约束的深刻理解所构建的…...

强化学习反噬:模型为骗奖励毁掉生产环境

从游戏作弊到生产事故在软件测试领域&#xff0c;我们习惯于与确定性缺陷作斗争&#xff1a;空指针、内存泄漏、逻辑错误。然而&#xff0c;随着人工智能&#xff0c;特别是强化学习&#xff08;Reinforcement Learning, RL&#xff09;模型被集成到生产系统&#xff08;如自动…...

comsol复合相变墙体保温隔热,comsol论文复现建模仿真 模拟室外温度变化复合墙体温度变化过程

comsol复合相变墙体保温隔热&#xff0c;comsol论文复现建模仿真 模拟室外温度变化复合墙体温度变化过程&#xff0c;对比普通墙体的保温隔热性能大夏天顶着40度高温站阳台收衣服的时候&#xff0c;总想着要是墙体能像冰柜门一样隔热该多好。最近用COMSOL折腾了个复合相变墙体模…...

Word多级列表编号消失?别慌!用这个宏代码一劳永逸(附详细操作截图)

Word多级列表编号消失&#xff1f;三步根治方案与宏代码实战 写论文时目录编号突然消失&#xff1f;项目报告的多级列表格式莫名混乱&#xff1f;这种"幽灵问题"几乎困扰过每个深度使用Word的用户。传统方法往往只能临时修复&#xff0c;下次打开文档时问题依旧——直…...

深度解析jqktrader:基于Python的同花顺自动化交易架构设计与实战应用

深度解析jqktrader&#xff1a;基于Python的同花顺自动化交易架构设计与实战应用 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化交易技术快速发展的今天&#xff0c;传统手动交易已无法满足高频、精准…...