设计模式——备忘录模式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;
    }

    @Override
    public 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}

总结

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

代码下载

代码下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux-时间同步服务器

1. (问答题) 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 编写脚本文件 #!/bin/bash hostnamectl hostname ntp_server.example.com cd /etc/NetworkManager/system-connections/ rm -fr * cat > eth0.nmconnection <&…

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…

【架构-14】数据库性能优化方式

数据库出现性能瓶颈对外的表现为&#xff1a; 大量请求阻塞SQL操作变慢存储出现问题 为解决上述出现的问题&#xff0c;因此推出了一系列的数据库性能优化方式。 数据库性能优化是提高数据库系统性能和响应时间的关键任务。以下是一些常见的 数据库性能优化方式&#xff1a; …

力扣152. 乘积最大子数组

Problem: 152. 乘积最大子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们创建两个数组maxNum和minNum&#xff0c;并将它们初始化为输入数组nums。这两个数组用于存储到当前位置的最大和最小乘积。我们还需要一个变量maxProduc…

51单片机之DS1302实时时钟

1.DS1302时钟芯片介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能RTC(Real Time Clock)&#xff1a;实时时钟&#xff0c;是一种集成电路&#xff0c;通常称…

HTML段落标签、换行标签、文本格式化标签与水平线标签

目录 HTML段落标签 HTML换行标签 HTML格式化标签 加粗标签 倾斜标签 删除线标签 下划线标签 HTML水平线标签 HTML段落标签 在网页中&#xff0c;要把文字有条理地显示出来&#xff0c;就需要将这些文字分段显示。在 HTML 标签中&#xff0c;<p>标签用于定义段落…

【前端】1. HTML【万字长文】

HTML 基础 HTML 结构 认识 HTML 标签 HTML 代码是由 “标签” 构成的. 形如: <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. <body> 为开始标签, </body> 为结束标签.少数标签只有开始标签, 称为 “单标签”.开始标签和…

一次配置Docker环境的完整记录

一次配置Docker环境的完整记录 Docker环境搭建报错与解决报错一报错二报错三 Docker环境搭建 本节介绍了一次配置docker环境的完整记录&#xff1a; 编写Dockerfile文件&#xff1a; FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-develRUN rm /etc/apt/sources.list.d/cuda.l…

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀&#xff0c;更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中&#xff0c;把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况&#xff1a; 简单⼯⼚模式包括三个主要⻆⾊…

zabbix 自动发现与自动注册 部署 zabbix 代理服务器

zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大。1.确保客户端…

uboot的移植

文章目录 一、官方uboot移植1.Uboot系统复制到Ubuntu系统2.解压Uboot系统3.编译Uboot系统4.生成可执行文件5.将u-boot.bin烧录到SD卡6.SD卡插入到板子&#xff0c;启动方式选择SD卡7.复位板子&#xff0c;查看打印信息&#xff0c;编译时间是否正常 二、根据官方提供的uboot添加…

frp 内网穿透配置(v0.55.1 版本)

注意&#xff1a;从 [v0.52.0] 版本开始&#xff0c;配置文件由 frps.ini 改成了 frps.toml 一种快速反向代理&#xff0c;可帮助您将 NAT 或防火墙后面的本地服务器暴露给 Internet。 GitHub 地址 &#xff1a; github.com/fatedier/fr… 下载之后如果碰到杀毒软件报毒&#x…

富文本在线编辑器 - tinymce

tinymce 项目是一个比较好的富文本编辑器. 这里有个小demo, 下载下来尝试一下, 需要配置个本地服务器才能够访问, 我这里使用的nginx, 下面是我的整个操作过程: git clone gitgitee.com:chick1993/layui-tinymce.git cd layui-tinymcewget http://nginx.org/download/nginx-1.…

00_Qt概述以及如何创建一个QT新项目

Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…

【一竞技CS2】VP战队官宣签下electroNic取代mir

1、近日VP战队官宣签下electroNic&#xff0c;以取代阵容中的mir。 electroNic自己也表示&#xff1a;“VP是一支顶级队伍。阵容核心曾赢得Major冠军&#xff0c;所有队员都处于巅峰状态并且时刻准备着去争夺冠军。我们有着一样的雄心壮志。 此外我还对和Jame很感兴趣&#xf…

解决nginx日志过大问题

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

AI大模型探索之路-应用篇14:认识国产开源大模型GLM

目录 前言 一、国产主流大模型概览 1. 国内主流大模型清单 2. 主流大模型综合指数 3. 大语言模型评测榜单 二、GLM大模型介绍 三、GLM大模型发展历程 四、GLM家族之基座模型GLM-130B 五、GLM家族之ChatGLM3 六、GLM家族之WebGLM 七、GLM家族之CogVLM 1. CogVLM 2. …

2024五一杯数学建模A题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

P9241 [蓝桥杯 2023 省 B] 飞机降落

原题链接&#xff1a;[蓝桥杯 2023 省 B] 飞机降落 - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dfs全排列的变形题。 因为最后问飞机是否降落&#xff0c;并且一架飞机降落完毕时另一架飞机才能降落。所以我们设置dfs的两个变量cnt为安全…

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题 3. 解决问题 1. 复现错误 使用EasyPoi导入数据时&#xff0c;Excel表格如下图&#xff1a; 但在导入时&#xff0c;出现如下错误&#xff1a; name为英文名称&#xff0c;在第一列&#xff0c…