技术成神之路:设计模式(九)备忘录模式

介绍

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。通过备忘录模式,可以在程序运行过程中保存和恢复对象的某个状态,从而实现“撤销”等功能。

1.定义


备忘录模式在《设计模式》一书中的定义是:

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

2.主要作用


提供一种方法,让对象可以返回到之前的状态,或者在需要的时候撤销其行为。

3.解决的问题


备忘录模式解决了以下问题:

  • 提供了一种捕获对象状态的方式,而不会破坏对象的封装。
  • 允许在不影响客户端代码的情况下保存和恢复对象状态。

4.模式原理


包含角色:

  • Originator(发起人):创建一个备忘录,记录当前时刻的内部状态,并可利用备忘录恢复内部状态。
  • Memento(备忘录):负责存储发起人的内部状态,在需要时提供这些内部状态。
  • Caretaker(管理者):负责保存好备忘录,不能对备忘录的内容进行操作或检查。

UML类图:
在这里插入图片描述
示例代码:

Memento 类 (备忘录)

用来存储状态

public class Memento {private final String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}

Originator 类(发起人)

创建一个包含当前状态的备忘录,并能够使用备忘录恢复状态。

public class Originator {private String state;public void setState(String state) {this.state = state;System.out.println("State set to: " + state);}public String getState() {return state;}public Memento saveStateToMemento() {return new Memento(state);}public void getStateFromMemento(Memento memento) {state = memento.getState();}
}

Caretaker 类(管理者)

该类负责保存和恢复备忘录。

public class Caretaker {private final List<Memento> mementoList = new ArrayList<>();public void add(Memento state) {mementoList.add(state);}public Memento get(int index) {return mementoList.get(index);}
}

使用

public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State #1");originator.setState("State #2");caretaker.add(originator.saveStateToMemento());originator.setState("State #3");caretaker.add(originator.saveStateToMemento());originator.setState("State #4");System.out.println("Current State: " + originator.getState());originator.getStateFromMemento(caretaker.get(0));System.out.println("First saved State: " + originator.getState());originator.getStateFromMemento(caretaker.get(1));System.out.println("Second saved State: " + originator.getState());}
}

打印

State set to: State #1
State set to: State #2
State set to: State #3
State set to: State #4
Current State: State #4
First saved State: State #2
Second saved State: State #3

备忘录模式的应用在我们工作中很常见,比如代码回滚,Ctrl + Z 回退上一步,文本编辑器中的撤销功能等,这些功能背后的核心思想都是保存系统特定时刻的状态,并在需要时恢复到这些状态。

5.优缺点


优点:

  • 不破坏封装性:对象的内部状态被封装在备忘录中,对象的封装性不被破坏。
  • 简化对象恢复:提供了一种机制,可以很方便地恢复对象的状态。
  • 支持撤销操作:通过保存对象的历史状态,可以实现撤销和恢复功能。

缺点:

  • 存储开销大:如果需要频繁保存状态,并且对象的状态占用内存较大,可能会导致存储开销较大。
  • 实现复杂:需要管理多个备忘录对象,可能会增加代码的复杂性。

6.应用场景


  1. 需要保存和恢复数据的场景:例如文本编辑器、画图程序等,用户需要撤销和恢复操作。
  2. 事务管理:例如数据库事务管理,可以在事务出现问题时回滚到之前的状态。
  3. 游戏存档:在游戏中,玩家可以保存进度,并在需要时恢复到之前的状态。
  4. 需要提供一个稳定的接口来访问对象状态,同时又不希望暴露其内部细节的场景。

7.总结


备忘录模式是一种非常实用的设计模式,它允许在不破坏对象封装性的前提下捕获和恢复对象的内部状态。通过这种模式,可以很方便地实现对象状态的保存和恢复,从而支持撤销、恢复、事务管理等功能。尽管它有一定的实现复杂性和存储开销,但在需要保存历史状态的应用场景中,备忘录模式无疑是一个非常有效的解决方案。

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

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

相关文章

【BUG】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10

UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 目录 UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#x…

使用python内置的虚拟环境

在一台机器上安装了太多的第三方python库&#xff0c;它们依赖相同的库可能版本不同&#xff0c;就会造成某些第三方库崩溃&#xff0c;之前可以使用的库可能就会坏掉不能用了&#xff0c;所以可以使用虚拟环境运行不同的程序&#xff0c;python有内置的虚拟环境&#xff1b; …

前端八股文 promise async await 的理解

promise是什么 Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案——回调函数和事件——更合理和更强大。 目的 解析 吴优编程 &#xff08;解决异步编程中的嵌套问题的&#xff0c;将嵌套的格式 用peomise 写成同步&#xff09; promise.then() 是成功后继…

Cocos Creator2D游戏开发(4)-飞机大战(2)-编辑器界面

编辑器几个重要板块 参考: https://docs.cocos.com/creator/3.8/manual/zh/editor/ (1) 场景编辑器: 仅看2D视图: 按钮作用依次是: 平移, 旋转,缩放,矩形变换,增量吸附工具,最后三个,前俩是变换工具,最后一个是布局组件 矩形变换: 中心点和锚点切换 以后用到慢慢整吧! (2)层…

AI服务器产业链研究分析

AI服务器产业链初探 一、AI服务器的技术架构与构成 AI服务器的主要构成包括&#xff1a; 芯片种类丰富&#xff0c;包括X86、ARM、MIPS等架构的CPU&#xff0c;以及GPU、FPGA、ASIC和NPU等。 内存&#xff1a;DRAM、HBM&#xff08;高带宽存储&#xff09;。 本地存储&#…

前端开发调试工具推荐分类整理

具体前往&#xff1a;前端调试工具分类整理汇总

黑马Java零基础视频教程精华部分_6_字符串

系列文章目录 文章目录 系列文章目录前言一、API是什么&#xff1f; API帮助文档案例&#xff1a;API文档练习Step1&#xff1a;查找文档中Scanner内容。Step2&#xff1a;学习文档中Scanner内容。 二、字符串String类1、String概述总结&#xff1a; 创建String对象的两种方式2…

java学习--String类StringBuffer类StringBuilder类

String类简介 关系图&#xff1a; value不可修改的是value指向的地址&#xff0c;因为可以value为一个数组&#xff0c;而数组名其实就相当于一个指针&#xff0c;指向着一块地址&#xff0c;然后在指向的地址里存放相应的值&#xff0c;值可以任意是什么&#xff0c;但是地址不…

RedHat Enterprise Linux 7 YUM源(本地/网络源)配置详解

目录 一、挂载 二、建立本地源 三、建立网络源 四、验证可行性 一、挂载 ——将光盘挂载到 /mnt 下 当/mnt中有如图内容时&#xff0c;即挂载成功 若挂载光驱/dev/sr0时报错&#xff1a;mount: no medium found on /dev/sr0 解决措施&#xff1a;查看该设备状态是否全部勾选…

MATLAB仿真:数字信号处理IIR数字滤波器设计

目录 1&#xff0e;实验目的 2&#xff0e;实验原理 3&#xff0e;实验仪器及设备 4. 实验内容及步骤 5&#xff0e;信号产生函数mstg清单 6.实验程序及波形如下&#xff1a; 1&#xff0e;实验目的 &#xff08;1&#xff09;熟悉用双线性变换法设计IIR数字滤波器的原理…

Python——Pandas(第三讲)

文章目录 修改替换变量值对应数值的替换指定数值范围的替换 虚拟变量变换数值变量分段数据分组基于拆分进行筛选 分组汇总使用 agg 函数进行汇总引用自定义函数 长宽格式转换转换为最简格式长宽型格式的自由互转 多个数据源的合并数据的横向合并concat 命令 处理缺失值认识缺失…

【题解】328. 奇偶链表(链表)

https://leetcode.cn/problems/odd-even-linked-list/description/?envTypestudy-plan-v2&envIdleetcode-75 class Solution { public:// 定义一个函数&#xff0c;用于将链表中的奇数和偶数节点分开ListNode* oddEvenList(ListNode* head) {// 创建两个哑节点&#xff…

python+vue3+onlyoffice在线文档系统实战20240723笔记,项目界面设计和初步开发

经过之前的学习,已经能够正常打开文档了。 目前为止,我们的代码能够实现: 打开文档编辑文档手动保存自动保存虽然功能依然比较少,但是我们已经基本实现了文档管理最核心的功能,而且我们有个非常大的优势,就是支持多人同时在线协同编辑。 现在我们要开发项目,我们得做基…

抽奖大转盘uni-push使用websocket协议实现uniapp+uniCloud实时推送在线互动抽奖项目打包H5微信小程序_咸虾米

嗨&#xff0c;大家好&#xff0c;我是爱搞知识的咸虾米&#xff0c;今天给大家带来的这们课程是使用uni-push实时推送&#xff0c;完成的在线互动抽奖综合项目。 常规的页面只有在手动刷新的时候&#xff0c;才能获取到服务端最新的数据&#xff0c;而websocket可以实现长连…

OpenJudge | 放苹果

总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法…

里程计在激光雷达slam中的作用

在tf树中的父坐标系和子坐标系中间的odom 机器人在平直走廊中由于缺少参照物的变化&#xff0c;无法估计自己的位移&#xff1b;可以通过轮子转动的圈数和一 圈的位移来计算距离&#xff0c;这种通过电机转速计算机器人位移的方法就是常用的电机里程计&#xff1b;里程计不 是…

简单高效的在线拾色器工具 - 为您的设计工作提供便利

你是否曾在寻找完美颜色时感到困扰&#xff1f;现在&#xff0c;有了这个简单而强大的在线拾色器工具&#xff0c;选择理想的颜色变得轻而易举&#xff01; 网址&#xff1a; https://potatoh5games.fun/tools/#ColorPickr 这款拾色器工具具有以下特点&#xff1a; 用户友好…

golang 文件

golang 文件 概念 文件是计算机系统中用于存储和管理的 数据集合&#xff0c;具有唯一的名称&#xff0c;存在于存储介质上&#xff0c;包含创建、修改等属性&#xff0c;通过文件系统进行组织&#xff0c;用户可进行读取、写入等操作 文件流 文件输入流&#xff08;InputS…

Linux进程控制——进程等待

文章目录 进程等待进程等待的必要性进程等待的方法status参数option参数 进程等待 进程等待的过程其实是父进程等待子进程死亡的过程 进程等待的必要性 如果子进程退出&#xff0c;父进程不进行处理&#xff0c;子进程会变成僵尸进程&#xff0c;有内存泄漏的风险 僵尸进程…

Adobe Acrobat Pro DC for Mac:PDF处理软件

Adobe Acrobat Pro DC for Mac是一款专为Mac用户设计的PDF处理软件&#xff0c;它凭借出色的功能和卓越的性能&#xff0c;成为了处理PDF文件的理想选择。 首先&#xff0c;Acrobat Pro DC for Mac支持全方位的PDF编辑。用户可以对PDF文档进行文本编辑、图像处理、表格制作等操…