设计模式——备忘录模式18

备忘录模式将创建状态快照 /备份的工作委派给实际状态的拥有者 (Originator) 对象。 这样其他对象就不再需要从 “外部” 复制文件状态了, 拥有者拥有其文件状态的完全访问权, 因此可以自行生成快照。
设计模式,一定要敲代码理解
在这里插入图片描述

文件信息( 需备份的源对象)

/*** @author ggbond* @date 2024年04月16日 08:38*/
public class LogFile {private  String name;private  int size;private Date time;private int version;public LogFile(String name, int size, Date time, int version) {this.name = name;this.size = size;this.time = time;this.version = version;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public Date getTime() {return time;}public void setTime(Date time) {this.time = time;}public int getVersion() {return version;}public void setVersion(int version) {this.version = version;}@Overridepublic String toString() {return "LogFile{" +"name='" + name + '\'' +", size=" + size +", time=" + time +", version=" + version +'}';}
}

备忘录(对备份源文件进行封装扩展)

/*** @author ggbond* @date 2024年04月16日 08:40* 备忘录类,在源数据LogFile进行封装扩展,也称快照信息。。*/
public class Memento {private LogFile logFile;public Memento(LogFile logFile) {this.logFile = logFile;}public LogFile getLogFile() {return logFile;}public void setLogFile(LogFile logFile) {this.logFile = logFile;}
}

拥有者/操作员

/*** @author ggbond* @date 2024年04月16日 08:42*  记录操作者, 能对记录获取与修改的同时,进行记录保存为快照与依据快照进行进行恢复数据*/
public class Originator {private  LogFile logFile;public LogFile getLogFile() {return logFile;}public void setLogFile(LogFile logFile) {this.logFile = logFile;}//保存为快照public Memento save(){return  new Memento(logFile);}//依据快照恢复现在操作的文件public void getMemento(Memento memento) {this.logFile=memento.getLogFile();}
}

管理员(版本控制)

/*** @author ggbond* @date 2024年04月16日 08:52*/
public class Administrator {private int cursor=0;//游标 版本指针private Map<Integer, Memento> map=new HashMap<>();private List<Memento> list=new ArrayList<>();

测试与结果

/*** @author ggbond* @date 2024年04月16日 09:23*/
public class Main {public static void main(String[] args) {//记录操作者Originator originator=new Originator();originator.setLogFile(new LogFile("file_ggbond1",30,new Date(),1));//备份中心Administrator administrator=new Administrator();administrator.add(originator.save());//备份originator.setLogFile(new LogFile("file_ggbond2",31,new Date(),2));administrator.add(originator.save());//备份originator.setLogFile(new LogFile("file_ggbond3",33,new Date(),3));administrator.add(originator.save());//备份//回滚originator.getMemento(administrator.undo());System.out.println(originator.getLogFile().toString());//再回滚originator.getMemento(administrator.undo());System.out.println(originator.getLogFile().toString());//再回滚originator.getMemento(administrator.undo());System.out.println(originator.getLogFile().toString());//前进版本originator.getMemento(administrator.redo());System.out.println(originator.getLogFile().toString());}
}
LogFile{name='file_ggbond3', size=33, time=Tue Apr 16 09:35:53 CST 2024, version=3}
LogFile{name='file_ggbond2', size=31, time=Tue Apr 16 09:35:53 CST 2024, version=2}
LogFile{name='file_ggbond1', size=30, time=Tue Apr 16 09:35:53 CST 2024, version=1}
LogFile{name='file_ggbond2', size=31, time=Tue Apr 16 09:35:53 CST 2024, version=2}

总结

可以在不破坏对象封装情况的前提下创建对象状态快照。实用性偏弱,数据不会保存在内存而是数据库。

代码下载

代码下载

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

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

相关文章

解决nginx日志过大问题

1. 问题点 nginx默认的日志在logs/access.log&#xff0c;并且是一直累加写入&#xff0c;时间长了就会非常大&#xff0c;占用过多的硬盘&#xff0c;如果强行删除是很不友好的&#xff0c;需要重启服务&#xff1b; 2. 文件分割 上图文件已经达到了十个G左右 处理的思路肯定…

PyTorch深度学习入门-2

PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili 一、神经网络的基本骨架 --nn.Module Neutral network torch.nn — PyTorch 2.2 documentation * import torch from torch import nnclass xiaofan(nn.Module):…

【LeetCode: 785. 判断二分图 + bfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

BLE架构图

PHY层(Physical layer 物理层) PHY层用来指定BLE所用的无线频段(2.4G)&#xff0c;调制解调方式和方法、跳频等。PHY层的性能直接决定整个BLE芯片的功耗、灵敏度以及selectivity等射频指标。 LL层(Link Layer 链路层) 链路层主要是对RF射频控制。链路层定义了协议栈中最为基础的…

动态规划Dynamic programming详解-背包问题【python】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a;LeetCode解锁1000题: 打怪升级之旅python数据分析可…

为什么科拓停车选择OceanBase来构建智慧停车SaaS应用

本文来自OceanBase的客户——拓客停车的实践分享 科拓停车简介与业务背景 作为智慧停车行业的佼佼者&#xff0c;科拓停车致力于提供全方位的智慧停车解决方案。服务涵盖车场运营管理、互联网智慧停车平台以及停车场增值服务等。通过不断研发创新&#xff0c;打造出了多样化的…

回归损失函数

目录 1 MAE 2 MSE 3 MAPE 4 Quantile Loss分位数损失 回归损失函数也可以做为评价指标使用&#xff0c;但是有没有想过数据分布与损失函数之间的关系呢&#xff01; 使用特定损失函数的前提是我们对标签的分布进行了某种假设&#xff0c;在这种假设的前提下通过极大似然法推…

Eclipse中 Maven安装与配置步骤,2024年最新面试总结

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

vscode如何方便地添加todo和管理todo

如果想在vscode中更加方便的添加和管理TODO标签&#xff0c;比如添加高亮提醒和查看哪里有TODO标签等&#xff0c;就可以通过安装插件快速实现。 安装插件 VSCode关于TODO使用人数最多的插件是TODO Height和Todo Tree 按住 CtrlShiftX按键进入应用扩展商店&#xff0c;输入to…

基于stm32_h5的freertos编程示例

目录 基于stm32_h5的freertos编程示例实验目的添加FreeRTOS配置FreeRTOS测试工程本文中使用的测试工程 基于stm32_h5的freertos编程示例 本文目标&#xff1a;基于stm32_h5的freertos编程示例 按照本文的描述&#xff0c;应该可以在对应的硬件上通实验并举一反三。 先决条件…

十大远程控制软件排名

远程控制软件在现代计算环境中扮演着至关重要的角色&#xff0c;它们使得用户能够轻松地访问和管理远程计算机或设备。随着技术的不断进步&#xff0c;市场上涌现出许多优秀的远程控制工具。以下是对当前市场上十大远程控制软件的简要排名和介绍&#xff0c;以帮助您选择最适合…

上位机图像处理和嵌入式模块部署(树莓派4b实现xmlrpc通信)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们也用纯API实现过上位机和开发板之间的通信。当时使用的方法&#xff0c;就是用windows自带的网络sdk和linux自带的api函数来完…