【设计模式-行为型】备忘录模式
一、什么是备忘录模式
来到备忘录模式了,这个模式我感觉相对简单一些,就是备份,或者快照。跟前面一样为了加深理解,我们引入一个电影情结来说明啥是备忘录模式,以来加深大家对备忘录模式的认识。那么,在电影中谁是此模式应用的王者呢。我想起一位,不知道大家有没有看过一个极其经典的电影,星爷的《大话西游》。在电影《大话西游》中,至尊宝利用月光宝盒不断穿越到紫霞仙子自杀前的时间段,试图改变结局。这种时间穿越和状态恢复的机制也可以类比为备忘录模式。
至尊宝:“般若波罗蜜~~~~~~~~~”
二当家:“哇,又升仙啦!咦?为什么要说‘又’?”
至尊宝通过月光宝盒(管理者)回到过去,每次穿越都会恢复到之前保存的状态(备忘录),从而尝试改变故事的走向。备忘录模式(Memento Pattern) 是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
二、为什么使用备忘录模式
那么我们拿《月光宝盒》来说一下为啥要使用备忘录模式
1. 需要保存对象的历史状态:如文本编辑器中的撤销、恢复功能。在《大话西游》中,至尊宝通过月光宝盒保存了多个历史状态,每次回到过去都是对这些历史状态的恢复。
2. 需要在程序运行时回滚对象状态:如游戏中存储和恢复玩家进度。在电影中,至尊宝利用月光宝盒不断回到过去,每次回到过去都是对之前状态的回滚。
3. 希望避免暴露对象的实现细节:通过备忘录隐藏对象的内部状态。在电影中,月光宝盒作为备忘录,保存了至尊宝的状态,而至尊宝自己和观众都无法直接访问这些状态,只能通过月光宝盒进行恢复。
备忘录模式通过在不破坏封装性的前提下,捕获并保存对象的内部状态,使得对象可以在需要时恢复到之前的状态。这种模式特别适用于需要撤销操作、历史记录功能或状态恢复的场景。在电影《大话西游》中,至尊宝利用月光宝盒不断回到过去,试图改变结局,这种机制很好地体现了备忘录模式的核心思想。
三、备忘录模式示例
1. 定义备忘录接口(Memento)(定义了备忘录的行为)
public interface Memento {// 备忘录接口,用于保存和恢复状态
}
2. 实现具体备忘录类(ConcreteMemento)(月光宝盒)
-
月光宝盒:用于存储至尊宝的内部状态,通常是一个简单的数据类。月光宝盒对至尊宝以外的其他对象是不可变的。
public class TimeMemento implements Memento {private String state;public TimeMemento(String state) {this.state = state;}public String getState() {return state;}
}
3. 定义发起人(Originator)(至尊宝(孙悟空))
- 至尊宝(孙悟空):负责创建备忘录对象,记录当前时刻的内部状态。至尊宝通过月光宝盒保存和恢复自己的状态
public class BrocadeHorse {private String state;public void setState(String state) {this.state = state;System.out.println("至尊宝的状态已更新为: " + state);}public String getState() {return state;}public Memento saveStateToMemento() {// 保存当前状态到备忘录return new TimeMemento(state);}public void getStateFromMemento(Memento memento) {// 从备忘录恢复状态setState(((TimeMemento) memento).getState());}
}
4. 定义管理者类(Caretaker)(猪八戒(二当家))
-
猪八戒(二当家):负责保存和管理备忘录,但不能直接操作备忘录的内容。猪八戒通过月光宝盒帮助至尊宝恢复状态。
public class MoonlightBox {private Memento memento;public void saveState(BrocadeHorse horse) {// 保存状态memento = horse.saveStateToMemento();System.out.println("月光宝盒保存了至尊宝的状态。");}public void restoreState(BrocadeHorse horse) {// 恢复状态horse.getStateFromMemento(memento);System.out.println("月光宝盒恢复了至尊宝的状态。");}
}
5. 场景重现
public class Main {public static void main(String[] args) {// 创建至尊宝对象BrocadeHorse brocadeHorse = new BrocadeHorse();// 创建月光宝盒对象MoonlightBox moonlightBox = new MoonlightBox();// 至尊宝的状态变化brocadeHorse.setState("初次见到紫霞仙子");// 保存状态moonlightBox.saveState(brocadeHorse);// 至尊宝的状态变化brocadeHorse.setState("紫霞仙子自杀");// 恢复状态moonlightBox.restoreState(brocadeHorse);// 至尊宝的状态变化brocadeHorse.setState("再次尝试拯救紫霞仙子");// 保存状态moonlightBox.saveState(brocadeHorse);// 恢复状态moonlightBox.restoreState(brocadeHorse);}
}//日志输出
至尊宝的状态已更新为: 初次见到紫霞仙子
月光宝盒保存了至尊宝的状态。
至尊宝的状态已更新为: 紫霞仙子自杀
月光宝盒恢复了至尊宝的状态。
至尊宝的状态已更新为: 再次尝试拯救紫霞仙子
月光宝盒保存了至尊宝的状态。
月光宝盒恢复了至尊宝的状态。
相关文章:
【设计模式-行为型】备忘录模式
一、什么是备忘录模式 来到备忘录模式了,这个模式我感觉相对简单一些,就是备份,或者快照。跟前面一样为了加深理解,我们引入一个电影情结来说明啥是备忘录模式,以来加深大家对备忘录模式的认识。那么,在电影…...
Linux环境下的Java项目部署技巧:安装 Mysql
查看 myslq 是否安装: rpm -qa|grep mysql 如果已经安装,可执行命令来删除软件包: rpm -e --nodeps 包名 下载 repo 源: http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…...
云原生(五十三) | SQL查询操作
文章目录 SQL查询操作 一、数据库DDL操作 1、登陆数据库 2、创建DB数据库 二、数据表DDL操作 1、创建数据表 2、RDS中SQL查询操作 三、SQL查询操作 1、RDS中SQL查询操作 SQL查询操作 一、数据库DDL操作 1、登陆数据库 2、创建DB数据库 创建一个普通账号,…...
【前端知识】常用CSS样式举例
文章目录 一、Flex盒子布局1. Flexbox 的基本概念2. Flex 容器的属性2.1 display2.2 flex-direction2.3 flex-wrap2.4 justify-content2.5 align-items2.6 align-content 3. Flex 项目的属性3.1 order3.2 flex-grow3.3 flex-shrink3.4 flex-basis3.5 flex3.6 align-self 4. 示例…...
硕成C语言1笔记
硕成C语言1笔记 这一节内容主要讲了进制转换 进制转换:十进制转其他进制用短除法,最后逆序输出十六进制的15表示的是F,255的十六进制是:FF其他进制转十进制:按权展开,从n的0次方开始,一直到最…...
[SAP ABAP] Debug Skill
SAP ABAP Debug相关资料 [SAP ABAP] DEBUG ABAP程序中的循环语句 [SAP ABAP] 静态断点的使用 [SAP ABAP] 在ABAP Debugger调试器中设置断点 [SAP ABAP] SE11 / SE16N 修改标准表(慎用)...
理解 InnoDB 如何处理崩溃恢复
在数据库领域,数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心,其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面,我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…...
UE5 蓝图学习计划 - Day 8:触发器与交互事件
在游戏开发中,触发器(Trigger) 和 交互事件(Interaction Events) 是实现游戏动态交互的关键。例如,当角色接近一扇门时,它可以自动打开,或者当玩家进入特定区域时,游戏触…...
根据接口规范封装网络请求和全局状态管理
封装通用页面接口网络请求 axios (request)封装见:https://blog.csdn.net/XiugongHao/article/details/143449863 /*** 封装通用页面的增删改查接口*/ export function postPageListData(pageName: string, queryInfo: any) {return request.…...
Unet 改进:在encoder和decoder间加入TransformerBlock
目录 1. TransformerBlock 2. Unet 改进 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transformer模型架构的基本组件,广泛应用于机器翻译、文本摘要和情感分析等自然语言处理任务…...
work-stealing算法 ForkJoinPool
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 重点是通过例子程序理解work-stealing算法原理 目录 work-stealing算法算法原理和优缺点介绍使用场景work-stealing例子代码 ForkJoinPoolnew ForkJoinPool(…...
DeepSeek Janus-Pro:多模态AI模型的突破与创新
近年来,人工智能领域取得了显著的进展,尤其是在多模态模型(Multimodal Models)方面。多模态模型能够同时处理和理解文本、图像等多种类型的数据,极大地扩展了AI的应用场景。DeepSeek(DeepSeek-V3 深度剖析:…...
STM32-时钟树
STM32-时钟树 时钟 时钟...
hot100_21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[…...
代码讲解系列-CV(一)——CV基础框架
文章目录 一、环境配置IDE选择一套完整复现安装自定义cuda算子 二、Linux基础文件和目录操作查看显卡状态压缩和解压 三、常用工具和pipeline远程文件工具版本管理代码辅助工具 随手记录下一个晚课 一、环境配置 pytorch是AI框架用的很多,或者 其他是国内的框架 an…...
C++ Primer 标准库类型string
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
计算机网络安全与运维的关键 —— 常用端口全解析
目录 前言 常见端口分类及用途 20 端口(FTP 数据传输) 21 端口(FTP 消息控制) 22 端口(SSH) 23 端口(Telnet) 25 端口(SMTP) 53 端口(DNS&…...
Vue.js 的介绍与组件开发初步
Vue.js 的介绍与组件开发初步 Vue.js 的介绍与组件开发初步引言第一部分:Vue.js 基础入门1.1 什么是 Vue.js?1.2 搭建 Vue.js 开发环境安装 Node.js 和 npm安装 Vue CLI创建新项目运行示例 1.3 第一个 Vue.js 示例 第二部分:Vue.js 组件开发基…...
【仿12306项目】通过加“锁”,解决高并发抢票的超卖问题
文章目录 一. 测试工具二. 超卖现象演示三. 原因分析四. 解决办法方法一:加synchronized锁1. 单个服务节点情况2. 增加服务器节点,分布式环境synchronized失效演示 方法二:使用Redis分布式锁锁解决超卖问题1. 添加Redis分布式锁2. 结果 方法三…...
wow-agent---task4 MetaGPT初体验
先说坑: 1.使用git clone模式安装metagpt 2.模型尽量使用在线模型或本地高参数模型。 这里使用python3.10.11调试成功 一,安装 安装 | MetaGPT,参考这里的以开发模型进行安装 git clone https://github.com/geekan/MetaGPT.git cd /you…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
