03-JAVA设计模式-备忘录模式

server/2024/10/11 13:20:14/

备忘录模式

什么是备忘录模式

Java中的备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。

主要角色包括:

  • 发起者(Originator):需要保存和恢复状态的对象。它记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,并可以访问备忘录里的所有信息。
  • 备忘录(Memento):负责存储发起人的内部状态。它是一个临时中间对象,用于存储目标对象的初始相关属性信息。当需要恢复对象的状态时,备忘录提供这些内部状态给发起人。
  • 看护者(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改。

优点:

  • 状态保存与恢复:备忘录模式可以方便地保存和恢复对象的状态,使得对象的状态变化具有可追溯性。
  • 封装性:通过将对象的状态封装在备忘录对象中,备忘录模式可以保持对象的封装性,不会暴露内部状态给外部对象。
  • 简化撤销和重做操作:在需要实现撤销、重做等功能的场景中,备忘录模式可以大大简化操作,提高代码的清晰度和可维护性。

缺点:

  • 资源消耗:如果对象的状态较为复杂或状态变化频繁,备忘录模式可能会消耗较多的内存资源来保存状态。
  • 性能开销:频繁地创建和销毁备忘录对象可能会导致一定的性能开销。
  • 设计复杂性:如果对象的状态需要保密或访问权限受限,备忘录模式可能会增加设计的复杂性,并可能破坏对象的封装性。

常见应用场景:

  • 文本编辑器:在文本编辑器中,备忘录模式可以用于实现撤销和重做功能。当用户编辑文本时,编辑器可以定期保存文本状态到备忘录对象中。当用户需要撤销或重做操作时,编辑器可以恢复或重新应用这些状态。
  • 游戏存档:在电子游戏中,备忘录模式可以用于实现游戏的存档功能。当玩家选择保存游戏时,游戏可以将当前的游戏状态(如玩家位置、分数、物品等)保存到备忘录对象中。当玩家再次加载游戏时,游戏可以从备忘录对象中恢复状态,让玩家继续之前的游戏进度。
  • 数据库事务:在数据库操作中,备忘录模式可以用于实现事务的回滚功能。当执行一系列数据库操作时,可以将数据库的状态保存到备忘录对象中。如果事务执行失败或需要回滚,可以恢复到之前的状态。

案例

java实现控制台输入内容的回退

UML

在这里插入图片描述

实现步骤:

  • 创建发起者ScannerInput,定义保存输入内容字段input
  • 创建备忘录继承发起者,主要继承发起者的属性及get/set方法不再重复提供,提供创建备忘录及通过备忘录恢复状态的方法
  • 创建看护者,定义栈对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改

实现代码

ScannerInput.java

java">// 发起者
public class ScannerInput {// 输入内容protected String input;public ScannerInput(String input) {this.input = input;}public String getInput() {return input;}public void setInput(String input) {this.input = input;}
}

Originator.java

java">// 备忘录
//  继承发起者,主要继承发起者的属性及get/set方法不再重复提供
//  提供创建备忘录及通过备忘录恢复状态的方法
public class Originator extends ScannerInput{public Originator(String input) {super(input);}// 创建备忘录public ScannerInput createMemento() {return new ScannerInput(this.input);}// 恢复public void restoreMemento(ScannerInput scannerInput) {this.input = scannerInput.getInput();}
}

Caretaker.java

java">import java.util.Stack;// 看护者
// * 对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改。
public class Caretaker {// 定义栈管理备忘录private Stack<ScannerInput> stack = new Stack<ScannerInput>();// 压栈public void setScannerInput(ScannerInput scannerInput) {stack.push(scannerInput);}// 出栈public ScannerInput getScannerInput() {if(stack.size() == 0){System.out.println("已经不可以回退啦!");}return stack.pop();}
}

TestClient.java

java">import java.util.Scanner;public class TestClient {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一些文本,输入'exit'退出:");// 创建原发器对象并设置默认内容Originator originator = new Originator("");// 创建并保存备忘录Caretaker caretaker = new Caretaker();// 初始化压栈caretaker.setScannerInput(originator.createMemento());while (true) {String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {System.out.printf("你输入了:%s%n" , input);break;}// 回退操作else if ("back".equalsIgnoreCase(input)) {// 回退originator.restoreMemento(caretaker.getScannerInput());System.out.printf("回退上一步-你输入:%s%n 输入:back(回退上一步) exit(退出)%n" , originator.getInput());} else {// 设置内容originator.setInput(input);// 设置备忘录caretaker.setScannerInput(originator.createMemento());System.out.printf("你输入了:%s%n 输入:back(回退上一步) exit(退出)%n" , originator.getInput());}}scanner.close();System.out.println("已退出。");}
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git


http://www.ppmy.cn/server/21948.html

相关文章

黑马面试篇

课程地址&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;_哔哩哔哩_bilibili 课程名称&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频…

ElementUI RUOYI 深色适配

1. 切换按钮&#xff1a;随便找个页面放上去 页面触发逻辑如下 a. html 按钮结构&#xff08;可自定义&#xff09; <el-switchstyle"margin-top: 4px; margin-left: 8px; margin-right: 8px"v-model"isDark"inline-promptactive-icon"Moon"…

RPC分布式通信框架

在实际开发中单机服务器存在诸多问题&#xff1a; 1.受限于硬件资源无法提高并发量 2.任意模块的修改都将导致整个项目代码重新编译部署 3.在系统中&#xff0c;有些模块属于CPU密集型&#xff0c;有些属于I/O密集型&#xff0c;各模块对于硬件资源的需求不一样 什么是分布式&a…

代码随想录算法训练营第12天:滑动窗口和前缀和

代码随想录算法训练营第12天&#xff1a;滑动窗口和前缀和 这里我参考了西法的博客&#xff0c; 467. 环绕字符串中唯一的子字符串(中等)795. 区间子数组个数(中等)904. 水果成篮(中等)992. K 个不同整数的子数组&#xff08;困难&#xff09;1109. 航班预订统计(中等) 前四…

虚良SEO的权重蜘蛛是真的吗?

权重蜘蛛&#xff0c;又称为搜索引擎蜘蛛或爬虫&#xff0c;是搜索引擎用来抓取和索引网页内容的重要工具。这些自动化程序在互联网上漫游&#xff0c;收集和分析信息&#xff0c;以帮助搜索引擎提供准确、相关和有用的搜索结果。权重蜘蛛的工作机制和特性对于理解搜索引擎优化…

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测

2024年新算法-鹦鹉优化器(PO)优化BP神经网络回归预测 亮点&#xff1a; 输出多个评价指标&#xff1a;R2&#xff0c;RMSE&#xff0c;MSE&#xff0c;MAPE和MAE 满足需求&#xff0c;分开运行和对比的都有对应的主函数&#xff1a;main_BP, main_PO, main_BPvsBP_PO&#x…

学习redis知识点

学习 Redis 时&#xff0c;可以按照以下分类来组织知识点&#xff1a; 核心概念 内存数据库&#xff1a;理解 Redis 作为内存数据库的特点和限制。数据结构&#xff1a;熟悉 Redis 支持的数据结构&#xff0c;如字符串、列表、集合、有序集合和散列。 数据类型及操作 字符串…

【春秋云境】文件上传漏洞合集

CVE-2022-30887 1.题目简介 2.CVE-2022-30887简介 使用工具&#xff1a; 蚁剑 burpsuite 一句话木马 3.渗透测试 输入用户名密码进行抓包 猜测账号密码 无有用信息&#xff0c;根据页面现有信息找到作者邮箱&#xff1a; mayuri.infospacegmail.com&#xff0c;猜测密码为&a…