21、设计模式之备忘录模式(Memento)

news/2024/5/10 9:14:29

一、什么是备忘录模式
备忘录模式又称快照模式,是一种行为型设计模式。它可以在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要的时候恢复到原先保存的状态。

二、角色组成

源发器(Originator):需要保存和恢复状态的对象。它创建一个备忘录对象,用于存储当前对象的状态,也可以使用备忘录对象恢复自身的状态。
备忘录(Memento):存储源发器对象的状态。备忘录对象可以包括一个或多个状态属性,源发器可以根据需要保存和恢复状态。
管理者(Caretaker):负责保存备忘录对象,但不能修改备忘录对象的内容。它可以存储多个备忘录对象,并决定何时将备忘录恢复给源发器。

三、优缺点
优点:

状态保存与恢复:备忘录模式可以帮助我们保存对象的状态,并在需要时恢复到之前的状态。这在某些情况下非常有用,比如撤销操作或者程序崩溃后的恢复。
封装性和隔离性:可以确保对象的状态保存在备忘录对象中,而不会暴露给其他对象。这为对象的封装性和隔离性提供了保护,使得对象的状态变化对其他对象是透明的。
缺点:

内存占用:可能引起较大的内存占用,特别是当对象的状态较多且状态改变频繁时。每个备忘录对象都需要保存一份完整的状态,如果状态较多或者备忘录对象较多,可能会消耗大量内存。
性能开销:备忘录模式涉及到创建、存储和恢复状态的操作,这些操作可能引起一定的性能开销。特别是在状态较大或者对象较复杂的情况下,备忘录模式的性能可能会受到影响。
四、应用场景
浏览器的回退:当我们点击回退箭头时,浏览器会回退到上一个被浏览的网站,以显示之前访问的页面。

文本编辑器的撤销:如果误删了一些内容或者想恢复之前的修改,可以进行撤销操作。

数据库事务管理:当执行数据库操作时,我们可以将当前数据库的状态保存到备忘录对象中,在回滚操作或者发生错误时,可以使用备忘录对象恢复到之前的数据库状态。

五、代码实现
下面以文本编辑器为例,解释一下备忘录模式。

用户可以在编辑器中输入文本,并允许回退到之前的编辑状态。其中Editor类代表文本编辑器(源发器),它具有保存和恢复文本内容的功能。EditorMemento类表示备忘录对象,用于保存Editor的状态。History类作为管理者,负责保存和管理备忘录对象。

5.0 UML类图
在这里插入图片描述
5.1 EditorMemento——备忘录(Memento)

/*** * 1.备忘录(Memento):备忘录,保存编辑器的状态* 定义:存储源发器对象的状态。备忘录对象可以包括一个或多个状态属性,源发器可以根据需要保存和恢复状态。*/
public class EditorMemento {//文本内容 (可以是属性、也可以是对象)private  String content;public EditorMemento(String content) {this.content = content;}public String getContent() {return content;}
}

5.2 Editor——源发器(Originator)

/*** * 2.源发器(Originator):文本编辑器* 定义:需要保存和恢复状态的对象。它创建一个备忘录对象,用于存储当前对象的状态,也可以使用备忘录对象恢复自身的状态。*/
public class Editor {//内容(可以是属性、也可以是对象)private String content;public void setContent(String content) {this.content = content;}public String getContent() {return content;}// 创建备忘录对象,保存当前状态public EditorMemento createMemento() {return new EditorMemento(content);}// 恢复备忘录对象保存的状态public void restoreMemento(EditorMemento memento) {content = memento.getContent();}}

5.3 History——管理者(Caretaker)

/*** * 3.管理者(Caretaker):历史记录* 定义:负责保存备忘录对象,但不能修改备忘录对象的内容。它可以存储多个备忘录对象,并决定何时将备忘录恢复给源发器。*/
public class History {//备忘录可以保存多个状态private final List<EditorMemento> mementos = new ArrayList<>();// 保存备忘录对象的状态public void push(EditorMemento memento) {mementos.add(memento);}// 弹出(移除)最近保存的备忘录对象,并返回它public EditorMemento pop() {int lastIndex = mementos.size() - 1;EditorMemento lastMemento = mementos.get(lastIndex);mementos.remove(lastIndex);return lastMemento;}}

5.4 testMemento

/*** * 备忘录模式测试类*/
@SpringBootTest
public class TestMemento {@Testvoid testMemento(){//创建文本编辑器(源发器)Editor editor = new Editor();//创建管理者History history = new History();// 编辑文本并保存状态editor.setContent("Hello");history.push(editor.createMemento());// 编辑更多文本并再次保存状态editor.setContent("Hello, Java!");history.push(editor.createMemento());editor.setContent("Hello,world!");System.out.println("当前内容: " + editor.getContent());// 恢复之前的状态editor.restoreMemento(history.pop());System.out.println("恢复后上一次内容: " + editor.getContent());editor.restoreMemento(history.pop());System.out.println("恢复后上二次内容: " + editor.getContent());}
}

在这里插入图片描述
六、总结
备忘录模式提供了一种灵活的机制来保存和恢复对象的状态,对于需要撤销、恢复或者状态管理的场景非常有用。然而,它也可能引起较大的内存占用和一定的性能开销,需要在使用之前慎重考虑。以下场景可以作为参考:

撤销和恢复功能:可以通过保存对象的历史状态来实现撤销和恢复功能,比如文本编辑器、绘图应用程序或任务管理器。
版本控制:如果你的应用程序需要跟踪对象状态的历史记录,并支持版本控制功能,备忘录模式可以帮助实现这种需求。例如,可以使用备忘录模式来实现文档的版本控制。
多阶段事务:备忘录模式可以用于实现多阶段事务的状态管理。在一个事务中,可能需要保存中间状态,以便在需要时回滚到之前的状态。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

UE5 局域网联机,寻找会话失败。

目录 参考资料&#xff1a; 尝试解决办法 1.1在【项目名.Build.cs】脚本中添加该行&#xff0c;添加后关闭编辑器&#xff0c;重新生成解决方案。​编辑 2.检查是否在同一个C类子网 参考资料&#xff1a; 1.Cant find session in LAN - Programming & Scripting / Mul…

bug--xxoobject has no attribute xxx

Python 创建类的实例后却不能调用写的方法&#xff0c;检查了半天原来是缩进的问题&#xff0c;def函数不应该和class并列 只能说这个英文空格太小了&#xff0c;看不出来。。。。

2023 收入最高的十大编程语言

本期共享的是 —— 地球上目前已知超过 200 种可用的编程语言&#xff0c;了解哪些语言在 2023 为开发者提供更高的薪水至关重要。 过去一年里&#xff0c;我分析了来自地球各地超过 1000 万个开发职位空缺&#xff0c;辅助我们了解市场&#xff0c;以及人气最高和收入最高的语…

从零开始学习深度学习库-2:反向传播

欢迎来到本系列的第二篇文章&#xff0c;我们将从头开始构建一个深度学习库。 本博客系列的代码可以在这个Github仓库中找到。 上一篇文章 在上一篇文章中&#xff08;链接见这里&#xff09;&#xff0c;我们实现了线性层和常见的激活函数&#xff0c;并成功构建了神经网络的…

如何恢复丢失未保存的 Word 文档指南

在广阔的数字领域&#xff0c;对丢失未保存的 Word 文档的恐惧对于用户来说是再熟悉不过的焦虑了。本指南旨在对用户可能发现自己迫切需要恢复未保存文档的各种场景进行详尽的探索。无论是由于保存失败、意外的系统崩溃还是令人心碎的意外删除&#xff0c;请放心&#xff0c;我…

Github 2024-03-13 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目2Python项目2非开发语言项目2HTML项目1CSS项目1Dart项目1TypeScript项目1Go项目1JavaScript项目1《Hello 算法》:动画图解、一键运行的…