Java23种设计模式-行为型模式之备忘录模式

ops/2025/3/29 22:29:56/

备忘录模式(Memento Pattern):用于捕获和存储一个对象的内部状态,以便在以后可以将对象恢复到这个状态。备忘录模式通常用于实现撤销功能或者保存对象的历史状态

主要角色:
发起人(Originator):负责创建一个备忘录对象,用于记录当前的内部状态,并可以使用备忘录对象来恢复内部状态。
备忘录(Memento):用于存储发起人的内部状态,可以包含多个状态属性。
管理者(Caretaker):负责管理备忘录对象,可以保存多个备忘录对象,以便在需要时进行恢复操作。

优点:
1.支持撤销和恢复功能,可以方便地将对象恢复到之前的状态。
2.可以有效地封装对象的内部状态,避免直接暴露给外部。
3.简化了对象的备份和恢复操作,提高了代码的可维护性和可读性。
缺点:
可能会增加系统的复杂性,并且如果保存的状态过多,可能会占用较多的内存

适用范围
撤销/重做功能:在文本编辑器、图形编辑软件等应用中,用户可能希望撤销或重做他们之前的操作,备忘录模式可以很好地实现这一功能。
事务处理系统中的回滚操作:在数据库管理系统中,事务的回滚操作可以通过保存操作前的状态(即快照)来实现。如果事务执行失败,可以通过快照恢复到事务执行前的状态。
系统快照:在需要保存系统或应用程序的当前状态,以便在发生故障时可以恢复到该状态的场景中,可以使用备忘录模式
游戏存档:在游戏开发中,可以使用备忘录模式来保存游戏的进度,允许玩家在特定检查点保存游戏状态,并在需要时加载之前保存的状态。
版本控制系统:如Git,可以使用备忘录模式来保存文件的各个版本,允许开发者在不同版本之间切换。
配置文件管理:在系统上线过程中,记录线上配置文件的状态,以便在紧急情况下可以回滚到上一个稳定版本。
文档编辑器的恢复功能:在文档编辑器中,可以利用备忘录模式保存文档的历史状态,从而实现文档的恢复功能。
浏览器的后退功能:浏览器可以使用备忘录模式来保存用户访问过的网页状态,实现页面的后退和前进操作。

示例:备忘录Memento、发起人Originator和管理者Caretaker。通过这些类的协作,我们可以保存和恢复对象的状态。在测试类中,我们创建了一个发起人对象和一个管理者对象,并对其进行状态的保存和恢复操作,最终输出了保存和恢复后的状态

// 备忘录
public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}
// 发起人
public class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveStateToMemento(){return new Memento(state);}public void getStateFromMemento(Memento memento){state=memento.getState();}
}
// 管理者
public class Caretaker {private List<Memento> mementoList=new ArrayList<>();public void addMemento(Memento memento){mementoList.add(memento);}public Memento getMemento(int index){return mementoList.get(index);}
}
// 测试类
public class MemenntoPatterrnTest {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State 1");originator.setState("State 2");caretaker.addMemento(originator.saveStateToMemento());originator.setState("State 3");caretaker.addMemento(originator.saveStateToMemento());System.out.println("Current State:" +originator.getState());originator.getStateFromMemento(caretaker.getMemento(0));System.out.println("First saved State:" + originator.getState());originator.getStateFromMemento(caretaker.getMemento(1));System.out.println("Second saved State:"+originator.getState());}
}

http://www.ppmy.cn/ops/20552.html

相关文章

C语言-动态内存分配

即使行动导致错误&#xff0c;却也带来了学习与成长;不行动则是停滞与萎缩。&#x1f493;&#x1f493;&#x1f493; •&#x1f319;知识回顾 亲爱的友友们大家好&#xff01;&#x1f496;&#x1f496;&#x1f496;&#xff0c;我们紧接着要进入一个新的内容&#xff0c;…

sqllibs 27-51关payload

目录 前言 Less-27 Less-27a Less-28 Less-28a Less-29 Less-30 Less-31 Less-32 Less-33 Less-34&#xff08;POST&#xff09; Less-35 Less-36 Less-37&#xff08;POST&#xff09; Less-38&#xff08;堆叠注入&#xff09; Less-39&#xff08;堆叠注入&…

前端算法

4大算法&#xff1a; 贪心算法&#xff1a;局部最优解分治算法&#xff1a;将一个问题分成多个小模块动态规划&#xff1a;每一个状态都是过去历史的总结回溯算法&#xff1a;不是最优选择的时候退回重新选 一、排序算法 1. 冒泡排序&#xff1a;数字越大越往上 第一次循环 比…

centOS 7.9操作

名称日期版本作者centOS7.9操作2024.4.271.0lll 实验题目&#xff1a; 创建一个用户。 在创建的用户中再创建一个2024的目录。 在2024的下在创建一个 1---10的目录&#xff0c;再创建一个a--z.txt的文件。 在创建一个2024bak的目录。 再将当前用户的所有文件备份到2024ba…

DL - 图像分割

from transformers import SegformerFeatureExtractor import PIL.Image#一个把图像转换为数据的工具类 feature_extractor SegformerFeatureExtractor()#模拟一批数据 pixel_values [PIL.Image.new(RGB, (200, 100), blue),PIL.Image.new(RGB, (200, 100), red) ]value [PI…

Win32 API 光标隐藏定位和键盘读取等常用函数

Win32 API 光标隐藏定位和键盘读取等常用函数 一、Win32 API二、控制台程序指令modetitlepausecls 三、控制台屏幕上坐标的结构体COORD四、句柄获取函数GetStdHandle五、控制台光标操作1.控制台光标信息结构体CONSOLE_CURSOR_INFO2.得到光标信息函数GetConsoleCursorInfo3. 设置…

Java面试题:描述策略模式及其在Java编程问题解决中的作用。

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换。策略模式让算法的变化独立于使用算法的客户&#xff0c;从而使得算法可以按需改变而不影响客户端。 策略…

Windows如何安装spark

Apache Spark是一个开源的大数据处理框架&#xff0c;旨在提供高效、通用和易用的大数据处理引擎。它最初由加州大学伯克利分校AMPLab开发&#xff0c;并于2010年开源。 Spark提供了一个基于内存的计算引擎&#xff0c;可以在大规模数据集上执行高速的数据处理任务。相比传统的…