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

【设计模式-行为型】备忘录模式

一、什么是备忘录模式

        来到备忘录模式了,这个模式我感觉相对简单一些,就是备份,或者快照。跟前面一样为了加深理解,我们引入一个电影情结来说明啥是备忘录模式,以来加深大家对备忘录模式的认识。那么,在电影中谁是此模式应用的王者呢。我想起一位,不知道大家有没有看过一个极其经典的电影,星爷的《大话西游》。在电影《大话西游》中,至尊宝利用月光宝盒不断穿越到紫霞仙子自杀前的时间段,试图改变结局。这种时间穿越和状态恢复的机制也可以类比为备忘录模式。

        至尊宝:“般若波罗蜜~~~~~~~~~”

        二当家:“哇,又升仙啦!咦?为什么要说‘又’?”

        至尊宝通过月光宝盒(管理者)回到过去,每次穿越都会恢复到之前保存的状态(备忘录),从而尝试改变故事的走向。备忘录模式(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数据库 创建一个普通账号&#xff0c…...

【前端知识】常用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…...

DAMOYOLO模型一键部署教程:基于Ubuntu20.04与Docker环境

DAMOYOLO模型一键部署教程:基于Ubuntu20.04与Docker环境 想试试最新的目标检测模型,但被复杂的依赖和配置搞得头大?别担心,今天咱们就来聊聊怎么用最简单的方式,在Ubuntu 20.04上把DAMOYOLO模型跑起来。整个过程就像搭…...

极客玩法:OpenClaw+Qwen3-14B控制智能家居实战

极客玩法:OpenClawQwen3-14B控制智能家居实战 1. 为什么选择OpenClaw控制智能家居? 去年装修新房时,我给自己定了个小目标:所有智能设备必须能通过自然语言控制。市面上的语音助手总让我觉得"差点意思"——要么响应慢…...

别再手动输路径了!用VS Code Remote-WSL一键直达Ubuntu 20.04的home目录

极速直达WSL开发环境:VS Code高效工作流全指南 每次在Windows和WSL之间来回切换路径,就像在两个平行宇宙间手动搭建桥梁。作为深度使用WSL的开发者,我经历过无数次在资源管理器地址栏手输\\wsl$的痛苦,也曾在终端反复cd到项目目录…...

玩转openrgb

缘由我的asus b760m有rgb,但是华硕Armoury Crate 确实比较臃肿,经常啥也没干它占用3-5%。而开源界有个openrgb,虽然看似简陋但是它小啊。于是采用python脚本openrgb来玩转它。本方案应该也适用于其他rgb主板。准备工作1、下载openrgb&#xf…...

OpenClaw自动化边界:千问3.5-27B不适合处理的五类任务

OpenClaw自动化边界:千问3.5-27B不适合处理的五类任务 1. 为什么需要明确自动化边界? 去年冬天,我花了整整三天时间调试一个OpenClaw自动化流程——让AI帮我整理电脑里积压的200GB设计素材。当看到脚本误删了未备份的客户源文件时&#xff…...

暑期实习面经记录(十四)(java)(4.2号补充下,闪闪改改)

本人最近面的被问的比较多的java八股先完成再完美1.如何设计一个扣减库存或者说秒杀抢券系统2.最近问这个问的比较多多线程->线程池->并发安全->场景2.锁->synconiezed,retranlock->可重入吗->怎么实现的2.1读写锁 怎么实现的;AQS底层&#xff1b…...

电源管理入门-12 clock驱动

电源管理的两个大方面就是电压和时钟。 Clock 时钟就是 SoC 中的脉搏,由它来控制各个部件按各自的节奏跳动。比如,CPU主频设置,串口的波特率设置,I2S的采样率设置,I2C的速率设置等等。这些不同的clock设置,…...

FastAPI系列 4 - 模块化路由的艺术:APIRouter实战指南

1. 为什么需要模块化路由? 第一次用FastAPI开发电商后台时,我把所有路由都堆在main.py里。三个月后这个文件膨胀到2000多行代码,每次修改用户认证逻辑都要在订单处理和商品列表的代码块之间来回翻找。这种经历让我深刻理解了为什么APIRouter会…...

【计算机视觉实战】第10章 | 单阶段目标检测YOLO与SSD:实时检测的极致追求

欢迎来到《计算机视觉实战》系列教程的第十章。在第九章我们学习了Faster R-CNN等两阶段检测器,它们精度高但速度慢。本章我们将学习单阶段检测器(One-stage Detector),特别是YOLO和SSD,它们在保持可观精度的同时实现了…...

别再为联合仿真头疼了!手把手教你用Amesim 2019和Matlab 2022b配置S-Function(Win10环境)

从零搭建Amesim与Matlab联合仿真环境:避坑指南与实战技巧 联合仿真技术已成为多物理场系统设计的黄金标准,但配置过程却让无数工程师在深夜的办公室里抓狂——编译器版本冲突、环境变量设置错误、接口编译失败,每一个环节都可能成为项目进度的…...