20、备忘录模式(Memento Pattern,不常用)

备忘录模式又叫作快照模式,该模式将当前对象的内部状态保存到备忘录中,以便在需要时能将该对象的状态恢复到原先保存的状态。

备忘录模式提供了一种保存和恢复状态的机制,常用于快照的记录和状态的存储,在系统发生故障或数据发生不一致时能够方便地将数据恢复到某个历史状态。

备忘录模式的核心是设计备忘录类及用于管理备忘录的管理者类,其主要角色如下:

  • 发起人(Originator):记录当前时刻对象的内部状态,定义创建备忘录和恢复备忘录数据的方法。
  • 备忘录(Memento):负责存储对象的内部状态。
  • 状态管理者(Storage):对备忘录的历史状态进行存储,定义了保存和获取备忘录状态的功能。注意,备忘录只能被保存或恢复,不能进行修改。

UML设计图如下:

1)Original 原始数据类:

public class Original {
    private String value;

    public Original(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Memento createMemento() {
        return new Memento(value);
    }

    public void restoreMemento(Memento memento) {
        this.value = memento.getValue();
    }
}

2)Memento 备忘录类:

public class Memento {
    private String value;

    public Memento(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

3)Storage 备忘录管理类:

public class Storage {
    private Memento memento;

    public Storage(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

4)测试备忘录模式:

@Slf4j
public class MementoDemoTest {

    public static void main(String[] args) {
        Original original = new Original("Jobs");
        Storage storage = new Storage(original.createMemento());
        log.info("original value : " + original.getValue());
        original.setValue("Jordan");
        log.info("updated value : " + original.getValue());
        original.restoreMemento(storage.getMemento());
        log.info("restore value : " + original.getValue());
    }
}

 打印结果:

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

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

相关文章

网络安全项目实战(三)--报文检测

6. TCP/IP协议栈及以太网帧 目标 了解TCP/IP协议栈的组织结构掌握以太网帧的数据格式定义能应用编码实现以太网帧的解析方法 6.1. TCP/IP 协议栈 TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层&#xf…

【UML】第4篇 UML公共机制(补扩展机制)

目录 一、扩展机制 1.1 构造型 1.2 标记值(Tagged Value) 1.3 约束(Constraint) 上节扩展机制没有讲完,如上图。 一、扩展机制 1.1 构造型 UML中的扩展机制包括约束、构造型和标记值,其中的构造型定义…

yo!这里是Linux信号相关介绍

目录​​​​​​​ 前言 基本介绍 概念 信号列表 信号处理 产生(发送)信号 通过按键产生 系统函数产生 软件条件产生 硬件异常产生 阻塞信号 信号状态 sigset_t 状态相关函数 1.sigprocmask 2.sigpending 捕捉信号 内核态与用户态 捕捉过程 sigaction 后…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库? 随着数据量的急速上升,单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈,所以需要考虑拆分数据库,将数据库分布在不同实例上提升数据库可用性。主要的原因有如下: 磁盘存储。业务量剧增&…

nodejs项目设置全局变量(global)

文章目录 前言一、使用global二、解决type typeof globalThis has no index signature.ts问题1、新建 /types/global.d.ts文件2、或者直接在入口文件/src/index.ts定义 三、最终效果鼠标放在global上,可显示global的类型生效了~ ![在这里插入图片描述](https://img-…

I.MX RT1170双核学习(2):双核相互激活和启动流程

RT1170这个芯片带有双核:Cortex-M7和Corterx-M4,两个核都可以独立地运行,当然双核也可以同时运行。在上一篇文章中,介绍了一下在RT1170中消息模块MU的使用:双核通信之MU消息单元详解,因为这是双核之间用来通…

05 python数据容器

5.1 数据容器认识 5.2 python列表 5.2.1 列表的定义 演示数据容器之:list 语法:[元素,元素,....] #定义一个列表List List [itheima,uityu,gsdfg] List1 [itheima,6666,True] print(List) print(List1) print(type(List)) pr…

smartKettle离线部署及问题记录

目录 📚第一章 前言📗背景📗目的📗总体方向 📚第二章 部署📗源码下载📗后端部署📕导入后端项目📕修改settings.xml(自动下载相关jar包)📕 编译📕 …

0x13 链表与邻接表

0x13 链表与邻接表 数组是一种支持随机访问,但不支持在任意位置插入和删除元素的数据结构。与之相对应,链表支持在任意位置插入或删除元素,但只能按顺序依次访问其中元素。我们可以使用一个struct来表示链表的节点,其中可以存储任…

MySQL线上死锁案例分析

项目场景 项目开发中有两张表:c_bill(账单表),c_bill_detail(账单明细表),他们的表结构如下(这里只保留必要信息): CREATE TABLE c_bill_detail (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主…

Gin之GORM 查询语句

前期工作可以看之前的(连接数据库;以及确定要操作的库) Gin之GORM 操作数据库(MySQL)-CSDN博客https://blog.csdn.net/m0_72264240/article/details/134948202?spm1001.2014.3001.5502这次我们操作gin库下的另外一个…

Lenovo联想拯救者Legion Y9000X 2021款(82BD)原装出厂Windows10系统

链接:https://pan.baidu.com/s/1GRTR7CAAQJdnh4tHbhQaDQ?pwdl42u 提取码:l42u 联想原厂WIN10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式&am…

记录汇川:套接字TCP通信-梯形图

H5U集成一路以太网接口。使用AutoShop可以通过以太网方便、快捷对H5U进行行监控、下载、上载以及调试等操作。同时也可以通过以太网与网络中的其他设备进行数据交互。H5U集成了Modbus-TCP协议,包括服务器与客户端。可轻松实现与支持Modbus-TCP的设备进行通讯与数据交…

Redis哨兵模式:什么是哨兵模式、哨兵模式的优缺点、哨兵模式的主观下线和客观下线、投票选举、Redis 哨兵模式搭建

文章目录 什么是哨兵模式哨兵模式的优缺点主观下线和客观下线投票选举哨兵模式场景应用Redis version 6.0.5 集群搭建下载文件环境安装解压编译配置文件启动关闭密码设置 什么是哨兵模式 哨兵模式是Redis的高可用解决方案之一,它旨在提供自动故障转移和故障检测的功…

数据分析基础之《numpy(3)—基本操作》

一、基本操作 1、adarray.方法() 2、np.函数名() 二、生成数组的方法 1、生成0和1的数组 为什么需要生成0和1的数组? 我们需要占用位置,或者生成一个空的数组 (1)ones(shape[, dtype, order]) 生成一组1 shape:形…

STM32读取EEPROM存储芯片AT24C512故障然后排坑记录

背景: 有一个项目用到STM32F091芯片去读取 AT24C512C-SSHD EEPROM 芯片,我直接移植了之前项目的IIC库,结果程序运行后,读不出EEPROM里面的数据。 摘要: 本文主要介绍一个基于STM32F091芯片和AT24C512C-SSHD EEPROM芯片…

Java面向对象思想以及原理以及内存图解

文章目录 什么是面向对象面向对象和面向过程区别创建一个对象用什么运算符?面向对象实现伪代码面向对象三大特征类和对象的关系。 基础案例代码实现实例化创建car对象时car引用的内存图对象调用方法过程 成员变量和局部变量作用范围在内存中的位置 关于对象的引用关系简介相关…

6、生产者压缩算法面面观

生产者压缩算法面面观 1、怎么压缩?2、何时压缩?2.1、生产者端2.2、Broker 端 3、何时解压缩?4、各种压缩算法对比 压缩的思想,实际就是用时间去换空间的经典 trade-off 思想,在 Kafka 中,就是用 CPU 时间去…

Linux | 多线程

前言 本文主要介绍多线程基础知识,以及使用多线程技术进行并发编程;最后会介绍生产者消费者模型; 一、线程基本认识 1、什么是线程 如果你是科班出生,你肯定听过线程相关概念;但是你可能没有真正搞懂什么是线程&#…

十八)Stable Diffusion使用教程:艺术二维码案例

今天说说怎么样使用SD生成艺术二维码。 我们直接上图。 方式有三种,分别如下: 1)方式一:直接 contronet 的tile模型进行控制 使用QRBTF Classic生成你的二维码。 首先输入网址,选择喜欢的二维码样式(推荐第一种就行): 然后选择相应参数,这里推荐最大的容错率,定…