【玩转23种Java设计模式】行为型模式篇:备忘录模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
文章目录
- 一、简介
- 二、实例
- 1、文本编辑器(TextEditor)
- 2、管理者(Caretaker)
- 3、客户端(MementoPatternExample)
- 三、总结
- 1、优点
- 2、缺点
- 3、应用场景
一、简介
备忘录模式(Memento Pattern)是一种行为型设计模式,用于保存对象的状态,以便在未来可以恢复到之前的某个状态。该模式避免了直接暴露对象的内部状态,从而实现了数据的封装性。
主要角色:
- Originator(发起人):创建并存储自身状态到备忘录中,可以从备忘录中恢复状态。
- Memento(备忘录):存储发起人的状态,提供给发起人恢复状态的接口。
- Caretaker(管理者):负责保存和管理备忘录,但不能操作备忘录内容。
二、实例
例如:模拟文本编辑器中“撤销”操作的实现。
1、文本编辑器(TextEditor)
class TextEditor {private String text;public void setText(String text) {this.text = text;}public String getText() {return text;}// 创建备忘录public Memento save() {return new Memento(text);}// 从备忘录恢复状态public void restore(Memento memento) {this.text = memento.getText();}// Memento:备忘录内部类static class Memento {private final String text;private Memento(String text) {this.text = text;}private String getText() {return text;}}
}
2、管理者(Caretaker)
class Caretaker {private final List<TextEditor.Memento> mementoList = new ArrayList<>();public void addMemento(TextEditor.Memento memento) {mementoList.add(memento);}public TextEditor.Memento getMemento(int index) {return mementoList.get(index);}
}
3、客户端(MementoPatternExample)
public class MementoPatternExample {public static void main(String[] args) {TextEditor editor = new TextEditor();Caretaker caretaker = new Caretaker();// 初始状态editor.setText("Hello");System.out.println("Initial Text: " + editor.getText());caretaker.addMemento(editor.save());// 修改状态1editor.setText("Hello, World");System.out.println("Updated Text: " + editor.getText());caretaker.addMemento(editor.save());// 修改状态2editor.setText("Hello, Design Patterns");System.out.println("Updated Text: " + editor.getText());caretaker.addMemento(editor.save());// 撤销操作editor.restore(caretaker.getMemento(1));System.out.println("After Undo: " + editor.getText());// 再次撤销editor.restore(caretaker.getMemento(0));System.out.println("After Second Undo: " + editor.getText());}
}
三、总结
1、优点
- 封装性好:发起人和备忘录内部状态的实现细节对外界透明,保证了对象的封装性。
- 状态恢复:可以轻松保存和恢复对象的状态,适合需要频繁回退操作的场景。
- 灵活性高:支持保存多个状态,提供多种恢复方式。
2、缺点
- 资源消耗大:如果状态对象较大或需要保存的状态很多,可能会消耗较多内存。
- 管理复杂:需要一个管理机制来保存和恢复状态,增加了系统复杂性。
3、应用场景
- 撤销和重做功能:如文本编辑器、图形编辑器。
- 游戏存档:在游戏中保存和恢复玩家的进度。
- 事务性操作:在操作失败时可以回滚到之前的状态。
- 状态恢复:适用于需要频繁切换对象状态的场景。
相关文章:
【玩转23种Java设计模式】行为型模式篇:备忘录模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
Unity Shader TexelSize的意义
TexelSize在制作玻璃折射效果时会用到。 // Get the normal in tangent space fixed3 bump UnpackNormal(tex2D(_BumpMap, i.uv.zw)); // Compute the offset in tangent space float2 offset bump.xy * _Distortion * _RefractionTex_TexelSize.xy; i.scrPos.xy offset * i…...
三、STM32MP257系列之定制Yocto Machine
文章目录 STM32MP257系列之定制的Yocto Machine1. TFA 定制2. OPTEE OS定制3. Uboot 定制3.1 创建 board3.2 创建 board的头文件3.3 创建 board的配置文件3.4 添加我们自己的dtb文件3.5 生成新patch打包到uboot recipe中3.6 修改yocto中的配置 4. Kernel 定制4.1 定制设备树 5.…...
小程序信息收集(小迪网络安全笔记~
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...
使用 Docker 搭建 Drogon 框架
使用 Docker 搭建 Drogon 框架 Drogon 是一个基于 C 的高性能 Web 框架,支持异步 I/O 和协程。使用 Docker 可以快速搭建 Drogon 开发环境,避免依赖冲突和配置问题。 以下是使用 Docker 搭建 Drogon 框架的详细步骤: 1. 准备工作 安装 Doc…...
【Linux报告】实训一:GNME桌面环境的设置及应用
实训一:GNME桌面环境的设置及应用 【练习1】在图形模式和文本模式下登录Linux系统。 1、开启Linux虚拟机。 答:打开此虚拟机如图所示 2、观察屏幕上显示的启动信息。 3、当系统启动到图形界面时,用普通用户身份登录。 答:如图…...
活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识
课程介绍 参加“Azure 在线技术公开课:基础知识”活动,培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动,扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…...
vulnhub靶场【Hogwarts】之bellatrix
前言 靶机:hotwarts-dobby,ip地址为192.168.1.69 攻击:kali,ip地址为192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24扫描发现主机 信息收集 使用nmap扫描端…...
移动 APP 设计规范参考
一、界面设计规范 布局原则: 内容优先:以内容为核心进行布局,突出用户需要的信息,简化页面导航,提升屏幕空间利用率.一致性:保持界面元素风格一致,包括颜色、字体、图标等,使用户在…...
HarmonyOS:@Require装饰器:校验构造传参
一、前言 Require是校验Prop、State、Provide、BuilderParam和普通变量(无状态装饰器修饰的变量)是否需要构造传参的一个装饰器。 说明 从API version 11开始对Prop/BuilderParam进行校验。 从API version 11开始,该装饰器支持在元服务中使用。 从API version 12开…...
github提交不上去,网络超时问题解决
问题出现的原因: DNS服务器数据不同步,github的服务器发送迁移,在本地缓存的ip地址现在无效了。 解决方案: 1)点击这里,查询github.com最新的ip地址 2.0)编辑linux系统地址缓存文件&#x…...
国产数据库OceanBase从入门到放弃教程
1. 介绍 是由蚂蚁集团(Ant Group,原蚂蚁金服)自主研发的分布式关系型数据库。它旨在解决海量数据存储和高并发访问的问题,特别适合金融级应用场景,如支付宝等对数据一致性、可靠性和性能有极高要求的服务。以下是关于…...
风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注
风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注 数据集下载: yolo v&#…...
Rabbitmq追问2
分析rabbitmq 默认使用姿势是什么 direct fanout还是什么 public void convertAndSend(String exchange, String routingKey, Object object, CorrelationData correlationData) throws AmqpException { this.send(exchange, routingKey, this.convertMessageIfNecessary(obje…...
郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现
0x01 产品简介 郑州时空-TMS运输管理系统是一款专为物流运输企业设计的综合性管理软件,旨在提高运输效率、降低运输成本,并实现供应链的协同运作。系统基于现代计算机技术和物流管理方法,结合了郑州时空公司的专业经验和技术优势,为物流运输企业提供了一套高效、智能的运输…...
如何使用React,透传各类组件能力/属性?
在23年的时候,我主要使用的框架还是Vue,当时写了一篇“如何二次封装一个Vue3组件库?”的文章,里面涉及了一些如何使用Vue透传组件能力的方法。在我24年接触React之后,我发现这种扩展组件能力的方式有一个专门的术语&am…...
汇编点灯练习
要求: 1、轮流将LED1、LED2、LED3及蜂鸣器点亮 2、基于STM32MP157AAA,阅读原理图和STM32MP157芯片手册 3、ARM汇编指令点灯 1、运行效果 汇编点灯 2、通过查询原理图和芯片手册,得到以下结论: 3、汇编源码 .text .global _start…...
数据结构与算法之动态规划: LeetCode 213. 打家劫舍 II (Ts版)
打家劫舍 II https://leetcode.cn/problems/house-robber-ii/description/ 描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的同时&#…...
Git工具
安装教程 详细安装教程 基本命令...
SpringBoot3.3.3+shardingsphere-jdbc5.5.0读写分离、自定义生成主键策略
最近在开发项目搭建框架时,考虑后期支付模块的订单数据量可能会比较大,于是使用现在主流的shardingsphere的读写分离、水平分表来解决后期数据量大影响查询效率的问题。 项目技术栈:jdk17Springboot3.3.3shardingsphere-jdbc5.5.0mybatis-pl…...
别再死记硬背DH参数表了!用Python从零推导PUMA560机器人正运动学(附完整代码)
用Python实战解析PUMA560机器人运动学:从DH参数到三维可视化 在机器人学领域,正运动学分析是理解机械臂运动原理的基础。许多初学者面对抽象的Denavit-Hartenberg(DH)参数和复杂的坐标系变换时,常常陷入死记硬背的困境…...
wx-dump-4j前端架构解析:React+Ant Design构建现代化管理界面
wx-dump-4j前端架构解析:ReactAnt Design构建现代化管理界面 【免费下载链接】wx-dump-4j 一款基于Java开发的微信数据分析工具。 项目地址: https://gitcode.com/gh_mirrors/wx/wx-dump-4j wx-dump-4j是一款基于Java开发的微信数据分析工具,其前…...
EasyPhoto与ControlNet深度集成:实现精准肖像控制的终极指南
EasyPhoto与ControlNet深度集成:实现精准肖像控制的终极指南 【免费下载链接】sd-webui-EasyPhoto 📷 EasyPhoto | Your Smart AI Photo Generator. 项目地址: https://gitcode.com/gh_mirrors/sd/sd-webui-EasyPhoto 在AI肖像生成领域࿰…...
【学习笔记】C++(2)
C++学习笔记 三、进阶 —— 类和对象 1、概述 2、基础 —— 公有、私有、保护、构造、析构 3、拷贝构造、临时对象不能绑定到非const引用问题 4、浅拷贝、深拷贝、移动拷贝 5、静态 6、内联和外联 7、链表 8、函数模板和类模板 9、友元 10、继承-派生(1) —— 基础 11、继承-…...
避坑指南:将π0模型从仿真迁移到Aubo真实机械臂,我踩过的那些‘坑’
从仿真到真实机械臂:π0模型迁移Aubo实战避坑手册 当我在实验室第一次看到π0模型在仿真环境中流畅地操控虚拟机械臂完成复杂抓取任务时,内心充满了将它部署到真实Aubo机械臂上的期待。然而,从仿真环境到真实硬件的迁移之路远比想象中坎坷——…...
避坑指南:在OpenHarmony ESP32上驱动INMP441麦克风时,I2S库编译报错的排查与解决
深度解析:OpenHarmony ESP32驱动INMP441麦克风的I2S编译问题全攻略 当你在OpenHarmony环境下为ESP32开发板移植INMP441数字麦克风驱动时,是否遇到过I2S库编译报错的困扰?这个问题看似简单,实则涉及编译系统、依赖管理和硬件抽象层…...
KL46Z电容触摸驱动库:TSI传感器适配与抗干扰实践
1. TSI传感器驱动库技术解析与工程实践1.1 项目背景与定位TSI(Touch Sensing Interface)是NXP Kinetis系列MCU内置的电容式触摸感应外设模块,专为低功耗、高抗噪性的人机交互应用设计。tsi_sensor是一个轻量级、可移植的固件库,面…...
网站推广seo优化公司如何做好移动端优化_网站推广seo优化公司如何提高网站的权重
网站推广seo优化公司如何做好移动端优化 在当前互联网市场的发展背景下,移动端的重要性日益凸显。无论是用户访问还是企业推广,移动端已经成为不可忽视的一部分。因此,网站推广seo优化公司在提升网站权重的过程中,移动端优化显得…...
不要让接口过早失去可选项
这,是一个采用C精灵库编写的程序,它画了一幅漂亮的图形: 复制代码 #include "sprites.h" //包含C精灵库 Sprite turtle; //建立角色叫turtle void draw(int d){for(int i0;i<5;i)turtle.fd(d).left(72); } int main(){ …...
实战指南:基于快马平台生成企业级cc switch管理系统,助力游戏项目开发
今天想和大家分享一个在游戏开发中特别实用的技术——CC Switch系统。这个系统在商业游戏项目中经常被用来做调试和功能开关控制,最近我在InsCode(快马)平台上快速实现了一个完整的企业级解决方案,整个过程特别顺畅。 先说说什么是CC Switch。简单理解就…...
