【设计模式】行为型设计模式之 备忘录模式(快照模式)

介绍

备忘录应用场景明确并且有限,一般用来数据的防丢失、撤销和恢复。对大对象的备份和恢复,备忘录模式能有效的节省时间和空间开销。

定义

备忘录模式:也称为快照模式,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态以便后续能将这个对象恢复成之前的状态。
备忘录模式的两个要点

  1. 存储副本以便后期恢复
  2. 要在不违反封装原则的前提下恢复

备忘录模式中的角色

  1. 原发器(Originator):负责创建一个备忘录,用以存储其当前状态;同时也可以利用备忘录恢复其内部状态
  2. 备忘录(Memento):用于存储原发器对象的内部状态。为了保护原发器对象的封装性,备忘录对象通常被设计为不可直接访问其内容,只暴露给原发器。
  3. 负责人(Caretaker):负责保管备忘录对象,但不直接读取或修改备忘录的内容。它只是简单的提供一个存储空间,用来在需要的时候传递给原发器。

使用记事本程序来理解各个角色

  1. 记事本本身为原发器,可以创建备份、从备份恢复
  2. 记事本备份为 Memento 备忘录,由原发器创建
  3. 保存所有记事本备份的对象则为负责人,保存所有的记事本备份。

代码示例

未使用备忘录模式实现输入备份

/*** 简单的文本编辑器** @author Jean* @date 2024/06/07*/
class InputText {private StringBuilder text = new StringBuilder();public String getText() {return text.toString();}public void append(String input) {text.append(input);}public void setText(String text) {this.text.replace(0, this.text.length(), text);}
}/*** 保存并处理快照** @author Jean* @date 2024/06/07*/
public class SnapshotHolder {private Stack<InputText> snapshots = new Stack<>();public InputText popSnapshot() {return snapshots.pop();}public void pushSnapshot(InputText inputText) {InputText deepClonedInputText = new InputText();deepClonedInputText.setText(inputText.getText());snapshots.push(deepClonedInputText);}}

问题:

  1. 为了能尽快恢复快照使用了 setText ,可能导致被其他业务误用,方法违背了封装原则。
  2. 快照本身应该是不可变的,不应该包含任何修改内部状态的函数,但是上述实现直接复用 InputText 的定义,也违反了快照的封装原则。

使用备忘录模式实现输入备份

    //定义一个文本编辑器,能保存编辑的文本//原发器(Originator) 负责创建一个备忘录,用以存储其当前状态;同时也可以利用备忘录恢复其内部状态。class InputText{private StringBuilder text = new StringBuilder();public String getText(){return text.toString();}public void append(String input){text.append(input);}}//备忘录角色//用于存储原发器对象的内部状态。为了保护原发器对象的封装性,备忘录对象通常被设计为不可直接访问其内容,只暴露给原发器。class SnapShot{private String text;public SnapShot(String text) {this.text = text;}public String getText() {return text;}}//负责人 caretaker//负责保管备忘录对象,但不直接读取或修改备忘录的内容。它只是简单的提供一个存储空间,用来在需要的时候传递给原发器。public class SnapshotHolder{private Stack<SnapShot> snapShots=new Stack<>();public SnapShot popSnapshot(){return snapShots.pop();}public void PushSnapshot(SnapShot snapShot){snapShots.push(snapShot);}}

总结

备忘录模式适合的场景如下:

  • 当需要实现撤销/重做功能时。
  • 当需要保存和恢复对象的内部状态,但又不想暴露这些状态的细节时。
  • 在某些性能非关键路径上,可以接受因保存状态而带来的资源消耗。

备忘录模式在实现时,设计者需要权衡状态保存的频率和成本,以确保不会因为过度使用而导致资源紧张。此外,也可以考虑对备忘录进行优化,比如限制保存的状态数量,或者采用更为高效的序列化技术来减少存储开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BFS实现图的点的层次-java

加强对广度优先搜索的理解&#xff0c;其实就是主要的3个步骤&#xff0c;外加数组模拟单链表是基础&#xff0c;要搞懂。 目录 前言 一、图中点的层次 二、算法思路 1.广度优先遍历 2.算法思路 三、代码如下 1.代码如下&#xff08;示例&#xff09;&#xff1a; 2.读入…

探索基于订阅式的电视App:Android TV 端强大的开源视频播放器

探索基于订阅式的电视App&#xff1a;Android TV 端强大的开源视频播放器 在智能电视和流媒体日益普及的今天&#xff0c;一款强大的视频播放器是家庭娱乐的重要组成部分。正是这样一款为Android TV设计的开源视频播放器。本文将深入探讨电视盒子OSC的技术特点、使用方法以及其…

在Java中类中的成员变量和成员方法在jvm中如何协调调用及优化

第一部分&#xff1a; 在Java中类中的成员变量和成员方法在jvm中如何协调调用 在Java中&#xff0c;类的成员变量和成员方法在JVM&#xff08;Java虚拟机&#xff09;中的表现方式有一定的规则和结构。以下是对成员变量和成员方法在JVM中的一些关键点的解释&#xff1a; 成员…

抛弃昂贵BI,企业仍可低成本实现数据分析

有的读者看完《BI工具选型不入坑&#xff0c;你要这么选》这篇文章就陷入迷茫了&#xff0c;我要做企业级数据分析&#xff0c;看过去各家产品都各有千秋&#xff0c;实在难以抉择&#xff0c;或者已经选了仍是纠结不已。 这里我抛出另一种思路&#xff1a;如果不用BI&#xf…

Terminal Multiplexer的使用

tmux&#xff08;Terminal Multiplexer&#xff0c;终端复用器&#xff09;是一个可以在单个终端窗口中运行多个独立会话的软件工具。它允许用户在同一个终端窗口内分割屏幕&#xff0c;创建多个虚拟终端&#xff0c;这样就可以同时监视和控制多个进程&#xff0c;即使终端窗口…

C#操作MySQL从入门到精通(17)——使用联结

前言: 我们在查询数据的过程中有时候查询的数据不是来自一个表而是来自多个表,本文使用的测试数据如下: 本文使用了两个表student_info、address_info student_info的数据如下: address_info的数据如下: 1、内联结 所谓内联结就是求交集,两个表都有的数据才是有效数…

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

46.django - 多语言配置

1.Django 多语言基础知识 多语言站点可以让不同语言的用户更好地使用和理解网站内容&#xff0c;提升用户体验和覆盖范围。为了实现多语言功能&#xff0c;我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分&#xff0c;感兴趣的可以看看。直接跳过…

安装搭建java版的悟空crm遇到 网络错误请稍候再试 终极解决办法(hrm人力资源模块)

java版 项目目录 ├── build – webpack 配置文件 ├── config – 项目配置文件 ├── src – 源码目录 │ ├── api – axios请求接口 │ ├── assets – 静态图片资源文件 │ ├── components – 通用组件 │ ├── directives – 通用指令 │ ├── filters –…

项目中的任务调度和消息队列方案详解

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 任务…

软件项目调研三部曲(调研计划,调研大纲,调研报告)原件获取

软件项目详细调研的目的是依据项目合同的要求&#xff0c;能够通过在客户现场&#xff0c;并通过访谈的方式&#xff0c;尽可能的了解客户的需求和业务现状&#xff0c;包括客户涉及到的业务部门的岗位设置、岗位职责、工作内容、工作流程、管理难点以及通过实施信息化系统的期…

GDPU Java 天码行空15 数据库编程

一、实验目的 1、 了解数据库的基础知识。 2、 掌握MySQL的下载、安装与配置。 3、 掌握MySQL可视化工具的使用。 4、 了解SQL语言。 5、 掌握JDBC中的API&#xff0c;并能进行简单的数据库操作。 二、实验内容 1、 安装MySQL &#x1f468;‍&#x1f3eb; 视频教程 2、建…

华为云加码数智升级 赋能山西培育新质生产力

加码企业数智升级&#xff0c;驱动山西新质生产力跃升。6月4日&#xff0c;“云上共创晋而有为”华为云山西数智升级思享会在山西智创城NO.1创新孵化基地举办。 活动由华为云计算技术有限公司主办&#xff0c;太原清控科创科技园管理有限公司协办。活动整合山西鲲鹏生态创新中…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

怎么开发vscode插件

开发VSCode插件主要涉及到JavaScript、TypeScript和Node.js。以下是一个基本的步骤&#xff1a; 环境准备&#xff1a;首先&#xff0c;你需要安装Node.js和VSCode。你还需要全局安装VSCode插件开发工具yo code。在命令行中运行以下命令&#xff1a; npm install -g yo generat…

Cocos2dx 编译游戏安装包制作教程

在本教程中&#xff0c;我们将学习如何为 Visual Studio 编译项目配置图标&#xff0c;并使用 Inno Setup 创建安装包。我们将包括以下部分&#xff1a; 设置项目图标&#xff1a;在 Visual Studio 中配置 .exe 文件的图标&#xff0c;或者使用第三方工具替换编译后的图标。创…

简记:为Docker配置服务代理

简记 为Docker配置服务代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/art…

网络流媒体协议——HLS协议

HTTP 实时流媒体&#xff08;HTTP Live Streaming&#xff0c;HLS&#xff09;协议是苹果公司提出的主要用于直播的流媒体协议。一个完整的基于HLS协议的流媒体直播系统由四部分组成&#xff0c;即音视频采集器、媒体服务器、媒体分发器和播放客户端。 媒体服务器 媒体服务器的…

深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss

深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss flyfish 本系列的主要内容是在2017年所写&#xff0c;GPT使用了交叉熵损失函数&#xff0c;所以就温故而知新&#xff0c;文中代码又用新版的PyTorch写了一遍&#xff0c;在看交叉熵损失函数遇到问题时&#xff0c;可…

小冬瓜AIGC 手撕LLM 拼课

小冬瓜aigc手撕LLM学习 官方认证 手撕LLMRLHF速成班-(附赠LLM加速分布式训练超长文档&#xff09; 帮助多名同学上岸LLM方向&#xff0c;包括高校副教授&#xff0c;北美PhD&#xff0c;大厂等 课程名称【手撕LLMRLHF】 授课形式&#xff1a;在线会议直播讲解课后录播 时间&…