设计模式(行为型设计模式——备忘录模式)

设计模式(行为型设计模式——备忘录模式)

备忘录模式

基本定义

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

模式结构

  • Originator:原发器。负责创建一个备忘录,用以记录当前对象的内部状态,也可以使用它来利用备忘录恢复内部状态。同时原发器还可以根据需要决定Memento存储Originator的那些内部状态。

  • Memento: 备忘录。用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento。在备忘录Memento中有两个接口,其中Caretaker只能看到备忘录中的窄接口,它只能将备忘录传递给其他对象。Originator可以看到宽接口,允许它访问返回到先前状态的所有数据。

  • Caretaker: 负责人。负责保存好备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

代码实现

Originator:原发器
//Originator 原发器
@Getter
@Setter
@Slf4j
public class Role {private int level;//等级private int blood;//血量public Role(int level, int blood) {this.level = level;this.blood = blood;}public void display(){log.info("当前状态:等级 {}, 血量 {}", level, blood);}//恢复之前的状态public void restore(Memento memento){this.level = memento.getLevel();this.blood = memento.getBlood();}//创建备忘录public Memento createMemento(){return new Memento(this.level, this.blood);}
}
Memento: 备忘录
@Data
public class Memento {private int level;//等级private int blood;//血量public Memento(int level, int blood) {this.level = level;this.blood = blood;}
}
Caretaker: 负责人
/*** @Description 负责人* 1、负责人保存备忘录* 2、负责人传递备忘录* 3、不能对备忘录内容操作/访问**/
@Setter
@Getter
public class Caretaker {Memento memento;
}
测试类
@Slf4j
public class Test {public static void main(String[] args) {Role role = new Role(10, 90);log.info("第一关通关, 开始存档");role.display();Caretaker caretaker = new Caretaker();caretaker.setMemento(role.createMemento());//继续闯关. 第二关BOSSlog.info("继续闯关. 第二关BOSS");role.setLevel(15);role.setBlood(10);role.display();//恢复存档log.info("打不过BOSS, 恢复存档");role.restore(caretaker.getMemento());role.display();}
}
输出结果

第一关通关, 开始存档
当前状态:等级 10, 血量 90 继续闯关.
第二关BOSS
当前状态:等级 15, 血量 10 打不过BOSS,
恢复存档 当前状态:等级 10, 血量 90

优点
  • 给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态。

  • 实现了信息的封装。使得用户不需要关心状态的保存细节。

缺点

消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景
  • 需要保存一个对象在某一个时刻的状态或部分状态。

  • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态。

模式总结
  • 备忘录模式可以实现在不破坏封装的前提下,捕获一个类的内部状态,并且在该对象之外保存该对象的状态,保证该对象能够恢复到历史的某个状态。
  • 备忘录模式实现了内部状态的封装,除了创建它的原发器之外其他对象都不能够访问它。
  • 备忘录模式会占用较多的内存,消耗资源。

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

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

相关文章

3527. 旋转矩阵 考研上机复试真题 暴力模拟

任意输入两个 9 阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵(顺时针),如果是,输出旋转角度(0、90、180、270),如果不是,输出 −1。 输入格式 第一行包含整数 n&a…

spring boot @Autowired 为null 处理

spring boot 开发中,经常用到 Autowired 注入某些服务,但有时发现注入的服务为null。原因很简单,因为服务生成是有先后顺序的。当要注入的服务还没有生成时,自然为null。 解决的方法:通过getBean 手工获取服务。 1、定…

基于python+vue中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

利用Jmeter工具对服务器,数据库进行性能监控,压测,导出性能测试报告

Jmeter是Apache基金会旗下的一款免费,开源,轻量级的性能测试工具,主要针对web应用程序客户端/服务器进行性能测试.它可以分别测试静态、动态资源(Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等),它可以通过线程组来模拟数个用户,在一段时间内同时登录服务器,数个用…

Matlab使用教程(持续更新)

1. Matlab Matlab被广泛的应用在数据分析,汽车仿真,机器人以及医学研究等众多方面。 它可以帮助我们理解研究复杂的系统。 在60年代和70年代,计算机使得科学家和工程师完成了以前不可能进行的计算;但是需要懂得计算机编程。 C…

概念解析| 基于互相关分析的信号最优延迟时间估计

注1:本文系"概念解析"系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:互相关的最大值对应信号的最优时间延迟。 寻找信号最优时间延迟的神奇法宝——互相关分析 通俗解释 问题:如何找到两个信号最佳的时间对齐方式? 想象一下,你有两…

CMU 10-414/714: Deep Learning Systems --hw4

通过之前作业中完成的所有组件,使用高性能的网络结构来解决一些问题。首先会增加一些新的算子(使用CPU/CUDA后端),然后完成卷积、以及用一个卷积神经网络来在CIFAR-10图像数据集上训练一个分类器。接着需要完成循环神经网络(带LSTM),并在Penn Treebank数据集上完成字符级…

AI原生安全 亚信安全首个“人工智能安全实用手册”开放阅览

不断涌现的AI技术新应用和大模型技术革新,让我们感叹从没有像今天这样,离人工智能的未来如此之近。 追逐AI原生?企业组织基于并利用大模型技术探索和开发AI应用的无限可能,迎接生产与业务模式的全面的革新。 我们更应关心AI安全原…

互感器电感的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,一次绕组和二次绕组3.2,铁芯3.3,绝缘4,工艺流程4.1,准备工作4.2,铁芯制造4.3,线圈制造4.4,组装4.5,质检4.6,包装和出厂

【高频SQL题目进阶版】1440.计算布尔表达式的值

错误答案: 我一开始以为,既然都能拿到值了, 那么把它们合并起来就可以了。后来发现不行。。 1 concat concat(v1.value ,operator ,v2.value) 它不是一个条件,而只是一个字符串 。 而if (condition, true_value, false_value)…

从后端获取文件数据并导出

导出文件的公共方法 export const download (res, tools) > {const { message, hide } tools;const fileReader: any new FileReader();console.log(fileReader-res>>>, res);fileReader.onload (e) > {if (res?.data?.type application/json) {try {co…

docker方式进行pytorch多机多卡分布式训练

docker ip共享与gpu指定 1)ip共享 docker网络有多种,这里选择host直接用宿主机的ip 2)指定gpu docker方式进行pytorch多机多卡分布式训练 nvidia docker 容器介绍链接:https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/ docker用的nvidia官方镜像…

Pytorch: torch.mean()

在PyTorch中,函数 torch.mean 用于计算张量的平均值(均值)。其可以对整个张量计算平均值,也可以沿某个或多个维度计算平均值。这个操作对于正则化数据、在神经网络中进行层间规范化等场合特别有用。 例子如下: impor…

复试专业前沿问题问答合集1

复试专业前沿问题问答合集1 人工智能基础知识问答 Q1: 什么是人工智能(AI)? A1: 人工智能(AI)是计算机科学的一个分支,它涉及创建能够执行通常需要人类智能的任务的机器和软件。这些任务包括学习(获取信息并根据信息对其进行规则化以达到结论)、推理(使用规则达到近…

数字孪生与智慧城市:重塑城市生活的新模式

随着信息技术的迅猛发展,数字孪生作为一种新兴的技术理念,正在逐渐改变城市建设和管理的传统模式。智慧城市作为数字孪生技术应用的重要领域,正在以其独特的优势和潜力,重塑着城市生活的方方面面。本文将从数字孪生的概念、智慧城…

中文编程入门(Lua5.4.6中文版)第十一章 Lua 模块与包 参考星争际霸游戏

在遥远的星争际霸世界中,代码模块就如同星际基地中的高科技仓库,储存着各类经过封装优化的战术指令和战略资源。自Lua 5.1版本起,星际编程者们引入了标准化的模块管理系统,使得不同战舰之间能够共享和调用核心战斗算法&#xff0c…

StarRocks学习笔记

介绍场景建表明细模型聚合模型更新模型主键模型 介绍 StarRocks是一款经过业界检验、现代化,面向多种数据分析场景的、兼容MySQL协议的、高性能分布式关系型分析数据库。 StarRocks充分吸收关系型 OLAP 数据库和分布式存储系统在大数据时代的优秀研究成果&#xff…

Linux命令:ps命令

目录 1 ps命令1.1 简介1.2 说明1、选项:2、输出格式控制:3、输出修饰符:4、显示线程:5、进程状态码:6、AIX 格式描述符7、标准格式指定符 1.3 实例1、默认输出2、使用标准语法查看系统上的每个进程3、使用BSD语法查看系…

算法体系-14 第十四 贪心算法(上)

一 、 递归套路解决判断完全二叉树 1.1 描述 1.2 分析 1.3 代码 public static boolean isCBT2(Node head) {return process(head).isCBT;}public static class Info {public boolean isFull;public boolean isCBT;public int height;public Info(boolean full, boolean cbt…

UI自动测试框架-selenium(1) selenium介绍和选择器

目录 1.selenium是什么 2.定位元素 2.1 css选择器 2.1.1 选择id 2.1.2 class 2.1.3使用标签选择 2.1.4父类选择器 子类选择器 2.2 xpath 1.selenium是什么 selenium是用来做web端自动化测试的框架,它支持各种游览器,各种平台,支持各种语言(如 Python,Java,C#,JS,Ruby..…