Java设计模式-备忘录模式Memento

news2024/9/20 8:56:52

介绍

  1. 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
  2. 可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。
  3. 备忘录模式属于行为型模式。

原理类图

在这里插入图片描述
对原理类图的说明-即(备忘录模式的角色及职责)

  1. originator : 对象(需要保存状态的对象)
  2. Memento : 备忘录对象,负责保存好记录,即 Originator 内部状态
  3. Caretaker: 守护者对象,负责保存多个备忘录对象, 使用集合管理,提高效率
  4. 说明:如果希望保存多个 originator 对象的不同时间的状态,也可以,只需要要 HashMap <String, 集合>

实战案例

  1. 应用实例要求
    游戏角色有攻击力和防御力,在大战 Boss 前保存自身的状态(攻击力和防御力),当大战 Boss 后攻击力和防御力下降,从备忘录对象恢复到大战前的状态。
  2. 思路分析和图解(类图):
    在这里插入图片描述

代码实现

public class Memento {
    //攻击力
	private int vit;
    //防御力
	private int def;

	public Memento(int vit, int def) {
		super();
		this.vit = vit;
		this.def = def;
	}

	public int getVit() {
		return vit;
	}

	public void setVit(int vit) {
		this.vit = vit;
	}

	public int getDef() {
		return def;
	}

	public void setDef(int def) {
		this.def = def;
	}
}
//守护者对象, 保存游戏角色的状态
public class Caretaker {
	//如果只保存一次状态
	private Memento memento;

	//对 GameRole 保存多次状态
	//private ArrayList<Memento> mementos;
	//对多个游戏角色保存多个状态
	//private HashMap<String, ArrayList<Memento>> rolesMementos;
	public Memento getMemento() {
		return memento;
	}

	public void setMemento(Memento memento) {
		this.memento = memento;
	}
}
public class Client {
	public static void main(String[] args) {
		// 创建游戏角色
		GameRole gameRole = new GameRole();
		gameRole.setVit(100);
		gameRole.setDef(100);
		System.out.println("和 boss 大战前的状态");
		gameRole.display();
		// 把当前状态保存 caretaker
		Caretaker caretaker = new Caretaker();
		caretaker.setMemento(gameRole.createMemento());
		System.out.println("和 boss 大战~~~");
		gameRole.setDef(30);
		gameRole.setVit(30);
		gameRole.display();
		System.out.println("大战后,使用备忘录对象恢复到站前");
		gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
		System.out.println("恢复后的状态");
		gameRole.display();
	}
}
public class GameRole {
	private int vit;
	private int def;

	//创建 Memento ,即根据当前的状态得到 Memento
	public Memento createMemento() {
		return new Memento(vit, def);
	}

	//从备忘录对象,恢复 GameRole 的状态
	public void recoverGameRoleFromMemento(Memento memento) {
		this.vit = memento.getVit();
		this.def = memento.getDef();
	}

	//显示当前游戏角色的状态
	public void display() {
		System.out.println("游戏角色当前的攻击力:" + this.vit + " 防御力: " + this.def);
	}

	public int getVit() {
		return vit;
	}

	public void setVit(int vit) {
		this.vit = vit;
	}

	public int getDef() {
		return def;
	}

	public void setDef(int def) {
		this.def = def;
	}
}

注意事项

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节
  3. 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存, 这个需要注意
  4. 适用的应用场景:1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理

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

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

相关文章

window系统path环境变量删除了怎么办?

前言 纪念我今天装JDK配置环境时&#xff0c;误删了path环境变量&#xff0c;后总结的知识点&#xff0c;希望对大家有所帮助&#xff0c;期待大家的评论&#xff01; 目录 前言 方案一&#xff1a;从注册表里找 方案二&#xff1a;实在没办法&#xff0c;从网上复制 方案三…

7-1输入/输出系统-概念外设接口

文章目录一.I/O系统基本概念&#xff08;一&#xff09;输入/输出系统&#xff08;二&#xff09;I/O控制方式二.外部设备1.显示存储器VRAM2.字符显示器3.外储存器三.I/O接口1.I/O接口的功能2.I/O接口的基本结构3.I/O接口的工作原理4.I/O接口的类型5.I/O端口及其编址&#xff0…

网络编程(TCP+UDP)(3)

1)咱们之前所说的网络分层就是因为说如果说使用一个协议太复杂了&#xff0c;那么我们就需要把这个协议分层&#xff0c;每一个协议都会简单一些&#xff0c;灵活替换也更方便&#xff1b; 2)咱们现在需要实现一个网络计算器&#xff1b; 1)上图是模拟一个计算器服务器和客户端…

第01天-Java数据结构和算法

001_几个经典的算法面试题(1)暴力匹配不推荐KMP算法分治算法002_几个经典的算法面试题(2)回溯算法图的深度优先遍历算法(DFS) 贪心算法优化003_内容介绍和授课方式数据结构和算法的重要性课程亮点和授课方式004_数据结构和算法的关系005_编程中实际遇到的几个问题Java代码小结…

机器学习实战(第二版)读书笔记(3)——膨胀卷积,WaveNet

一、基础知识 对于一个卷积层&#xff0c;如果希望增加输出单元的感受野&#xff0c;一般可以通过三种方式实现&#xff1a; 增加卷积核的大小增加层数&#xff08;比如两层3 3 的卷积可以近似一层5 5 卷积的效果&#xff09;在卷积之前进行池化操作 其中第1&#xff0c;2种…

推荐5个很牛的开源项目

大家伙们年过了哈&#xff0c;该收拾收拾心情上班了。 不知道大家有没有这种感觉&#xff0c;年纪越大&#xff0c;越觉得年过得快。感觉好像才刚开始&#xff0c;马上初五了&#xff0c;初六送完穷鬼&#xff0c;初七送自己出来上班了&#xff08;没有哭&#xff09;。 不过…

Python编写的词频统计工具的使用说明

一、工具下载 https://download.csdn.net/download/huangbangqing12/87400984 二、工具使用方式 目录文件如下所示&#xff1a; 请先在word.txt文件里放入目标长尾词&#xff0c;一行一个&#xff1a; 文件-另存为&#xff1a; 选择utf-8编码并直接保存替换原文件&#xff1…

二叉树的层次遍历

文章目录二叉树的层次遍历二叉树的层次遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637.二叉树的层平均值429. N 叉树的层序遍历515.在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针填充每个节点的下一个右侧节点指针II104.二叉树的最大深度二叉树的最小深度二…

ESPnet

文章目录关于 ESPnet安装配置运行 yesno关于 ESPnet github&#xff1a; https://github.com/espnet/espnet ESPnet is an end-to-end speech processing toolkit covering end-to-end speech recognition, text-to-speech, speech translation, speech enhancement, speaker …

机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照

声声慢寻寻觅觅 宋李清照 寻寻觅觅&#xff0c;冷冷清清&#xff0c;凄凄惨惨戚戚。 乍暖还寒时候&#xff0c;最难将息。 三杯两盏淡酒&#xff0c;怎敌他、晚来风急。 雁过也&#xff0c;最伤心&#xff0c;却是旧时相识。 满地黄花堆积&#xff0c;憔悴损&#xff0c;如今…

Web 应用程序——我的心理备忘单

介绍本文是“持续交付&#xff1a;HTML 到 Kubernetes”的一部分。虽然我迫不及待地想深入了解分布式系统的细节&#xff0c;但我发现自己处于一个不愉快的境地&#xff1a;我认为最好从前端开始写。那是因为网络应用程序是当今的标准。在多个云中部署的 ArgoCD-Kubernetes 集群…

商业智能BI,大数据时代的新趋势

根据IDC预测&#xff0c;2025年时中国产生的数据量预计将达48.6ZB&#xff0c;在全球中的比例为27.8%。在未来&#xff0c;数据会是构建现代社会的基本要素&#xff0c;也是社会的基本建设。这也不禁让我想起了最近新公布的《关于构建数据基础制度更好发挥数据要素作用的意见》…

高并发下如何保证接口的幂等性?

一、什么是幂等&#xff1f; 看一下维基百科怎么说的&#xff1a; 幂等性&#xff1a;多次调用方法或者接口不会改变业务状态&#xff0c;可以保证重复调用的结果和单次调用的结果一致。 二、使用幂等的场景 1、前端重复提交 用户注册&#xff0c;用户创建商品等操作&#…

使用这个工具,本地调试UI再也不用怕了

前言&#xff1a;在我们日常使用中&#xff0c;很多场景都会用到UI自动化&#xff0c;通用的都是PythonSelenium的方式。今天介绍一种&#xff0c;不用通过代码&#xff0c;直接通过页面可视化配置的方式&#xff0c;就可以完成我们想要的自动化场景。话不多说&#xff0c;正片…

ElasticSearch - 结果处理

目录 结果处理-排序 结果处理-分页 结果处理-高亮 结果处理-排序 elasticsearch默认是根据相关度算分(_score)来排序&#xff0c;但是也支持自定义方式对搜索结果排序可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等普通字段排序keyword、数…

pytorch图像分类全流程(五)--图像分类算法精度评估指标

本次我们来学习图像分类算法精度的各种评估指标&#xff1a;precision、recall、accuracy、f1-score、AP、AUC。 首先我们来学一个很重要的概念&#xff0c;混淆矩阵&#xff1a; 1.精确率(Precision)&#xff1a; 指的是所有被判定为正类&#xff08;TPFP&#xff09;中&…

8-Arm PEG-Succinamide Acid,8-Arm PEG-SAA,八臂-聚乙二醇-丁二酸酰胺供应

英文名称&#xff1a;8-Arm PEG-SAA&#xff0c;8-Arm PEG-Succinamide Acid 中文名称&#xff1a;八臂-聚乙二醇-丁二酸酰胺 8-臂PEG-SAA是一种多臂PEG衍生物&#xff0c;在连接到一个六甘油核心的八个臂的每个末端具有羧基。PEG和丁二酰胺酸COOH基团之间存在C3酰胺键。PEG酸…

HTML中引入CSS样式的第一种方式:内联定义方式

<!-- HTML中引入CSS样式的第一种方式&#xff1a;内联定义方式 语法格式&#xff1a; <标签 style"样式名:样式值;样式名:样式值;样式名:样式值;..."></标签> --> <!DOCTYPE html> <html> <head> …

操作系统(day01)

文章目录操作系统的功能和目标1.作为系统资源的管理者&#xff08;从中间往两边看&#xff09;2.作为用户和计算机硬件之间的接口&#xff08;从下往上看&#xff09;操作系统的四大特征共享虚拟异步操作系统的发展与分类手工操作阶段批处理阶段--多道批处理系统分时操作系统实…

基于蜣螂算法的极限学习机(ELM)回归预测-附代码

基于蜣螂算法的极限学习机(ELM)回归预测 文章目录基于蜣螂算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于蜣螂算法优化的ELM5.测试结果6.参考文献7.Matlab代码摘要&#xff1a;本文利用蜣螂算法对极限学习机进行优化&#xff0c;并用…