Java设计模式 _行为型模式_备忘录模式

一、备忘录模式

1、备忘录模式
备忘录模式(Memento Pattern)是一种行为型模式。通过保存一个对象的某个状态,以便在适当的时候恢复对象。

2、实现思路
(1)、定义记录数据的格式规范。
(2)、编写实现类,实现备忘实体对象。
(3)、定义操作对象类,内置数据和备忘录集合,记录当前对象的数据,同时添加到备忘录中。

二、代码场景

1、示例场景
用户可以多次操作一个数据,每次操作后的结果会改变。通过备忘录回溯之前的操作数据。
2、代码示例

// 1、定义数据格式
public interface Memento1 {
    String getData();
    void setData(String data);
}
// 2、定义实现类,即备忘录对象
public class MementoBook implements Memento1 {
    String data;   // 备忘录记录data数据
    public MementoBook(String data) {
        this.data = data;
    }
    @Override
    public String getData() {
        return data;
    }
    @Override
    public void setData(String data) {
        this.data = data;
    }
}
// 3、定义操作对象,记录数据,记录备忘录,封装回溯方法
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class Originator {
    String data;      // 操作数据
    List<MementoBook> mementoBooks;   // 备忘录集合

    public Originator() {
        mementoBooks = new ArrayList<>();
    }

    public void saveData(String data) {      // 保存操作数据
        this.data = data;
        mementoBooks.add(new MementoBook(data));
    }

    public void revoke() {                       // 返回上一次操作的数据
        this.data = mementoBooks.get(mementoBooks.size() - 2).getData();
        mementoBooks = mementoBooks.subList(0, mementoBooks.size() - 1);
    }

    public void revokeHistory(int index) {            // 返回到历史指定的数据
        this.data = mementoBooks.get(index - 1).getData();
        mementoBooks = mementoBooks.subList(0, index);
    }
}
// 4、测试
public static void main(String[] args) {
        Originator originator = new Originator();
        originator.saveData("1");
        originator.saveData("2");
        originator.saveData("3");
        originator.saveData("4");
        originator.saveData("5");
        originator.saveData("6");
        originator.saveData("7");
        originator.saveData("8");
        originator.saveData("9");
        originator.saveData("10");

        System.out.println("当前值:"+originator.getData());
        originator.revoke();
        System.out.println("撤回一步的值:"+originator.getData());
        originator.revoke();
        System.out.println("撤回一步的值:"+originator.getData());
        originator.revokeHistory(5);
        System.out.println("测绘到第5步当时的值:"+originator.getData());
    }

操作结果:
在这里插入图片描述

总结:备忘录,顾名思义就是怕忘记而做的笔记。主要用来做数据的回溯,方便查询过去时刻的数据。本例实现主要通过定义的一个集合,这个集合仅包含一个对象的操作接口,所以需要内置到对象的属性中。真实开发是,数据可以是任意类型的对象,保存也可以是数据库等第三方组件,但是一定要有一个原则,就是一个操作类仅能有自己的操作数据即可。

学海无涯苦作舟!!!

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

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

相关文章

多家大模型公司被爆“卖身”,有创业者称接单能力很重要

百模大战下&#xff0c;行业开始“洗牌”。 据外媒《The Information》的报道&#xff0c;随着底层通用大模型格局的基本落成&#xff0c;投资者的热情正在转向支持人形机器人等其他技术。 与此同时&#xff0c;科技巨头和生成式AI的早期赢家也正在加速掀起一场新浪潮&#x…

【信息学奥赛】两个整型变量的值交换

【信息学奥赛】两个整型变量的值交换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 编写如下一个函数&#xff0c;用于将两个整型变量的值交换 输入&#xff1a; 两个数 输出&#xff1a; 交换后的两个数 样例输入&#xff1a; 3 2样…

【大比武08】利用RAG技术构建档案智能问答系统

关注我们 - 数字罗塞塔计划 - # 大比武2024 本篇是参加“华夏伟业”杯第二届档案信息化公司业务与技术实力大比武&#xff08;简称“大比武 2024”&#xff09;的投稿文章&#xff0c;来自燕山大学档案馆&#xff08;校史馆&#xff09;的实际项目&#xff0c;由河北科怡科技…

Kivy 项目51斩百词 5

MRWord\pages\infopage\info.py def read_random_word(self) def read_random_word(self):"""随机读取一条数据"""sql "SELECT * FROM word WHERE id (SELECT word_id FROM today ORDER BY RANDOM() limit 1)"rows select_data(sq…

AdaBoost 乳腺癌数据挖掘

目录 1.数据集背景 2 集成学习方法 AdaBoost集成过程 3 个体学习器 结果评价 准确率以及混淆矩阵 评估集成学习模型的泛化学习能力 评估集成学习模型的多样性 结论 源码 1.数据集背景 乳腺癌数据集是一个非常经典的二元分类数据集&#xff0c;被广泛应用…

Java线程基础

一、相关概念 1、程序 为完成任务&#xff0c;用某种语言编写的一组指令的集合。 2、进程 进程是指运行中的程序。 进程是程序的依次执行过程&#xff0c;或是正在运行的一个程序&#xff0c;是一个动态过程&#xff1a;有自身产生、存在和消亡的过程。 3、线程 线程是由进程创…

拍视频麦克风什么牌子好?户外无线麦克风哪个牌子好,看本期文章

​无线领夹麦克风&#xff0c;作为现代音频技术的重要代表&#xff0c;已经广泛应用于各种场合。它不仅能提高演讲者的声音质量&#xff0c;还能增加演讲的互动性和生动性。然而&#xff0c;面对市场上众多的无线领夹麦克风产品&#xff0c;如何选择一款适合自己的设备成为了一…

产教协同|暴雨AI算力赋能传媒实践教学

近日&#xff0c;“第七届传媒实践教学创新研讨会暨中国高校影视学会实验教学专业委员会年会”在美丽的山城重庆成功举办。本次大会以“拥抱AI&#xff0c;融合共生”为主题&#xff0c;吸引了来自全国200多所高校、30多家企业以及700多位大视听实践教学产学研用各界专家、学者…

react跨组件通信Context

案例&#xff1a;现在有个父-子-孙组件 需要进行组件通信 import { useState } from "react"; // 创建上下文 const CountContext React.createContext();//子组件 const SonComponent (props) > {return (<div><h2>子组件</h2><Grandson…

便携式应急气象站:应急气象监测装备

TH-BQX5便携式应急气象站&#xff0c;作为现代气象监测的重要装备&#xff0c;以其独特的便携性、高效性和灵活性&#xff0c;在应急气象监测领域发挥着至关重要的作用。这类气象站不仅为灾害预警、环境保护、农业生产等多个领域提供了实时、准确的气象数据&#xff0c;还在突发…

记录一次Redisson使用synchronized和分布式锁不生效的原因

最近在开发的过程中&#xff0c;遇到了一个并发场景&#xff0c;用户进行方案复制的时候&#xff0c;当快速点击两次操作的时候&#xff0c;出现了复制方案重名的情况&#xff0c;实际上是复制方案的方案名称&#xff0c;是由后端根据数据库已有的方案名称和当前要复制的方案名…

Hugging face win使用教程(二)

1. 将环境迁移到win&#xff0c;可以直接下载修改好的cuda环境https://download.csdn.net/download/liangjiubujiu/89368302?spm1001.2014.3001.5503 2. 修改hugging face的缓存路径 3. 重启pycharm 4. 编写测试代码&#xff0c;注意可能由于网络链接问题&#xff0c;需要关…

Parasoft C++Test软件静态分析操作指南_编码规范/标准检查

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

嵌入式进阶——OLED显示器(SPI)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 SPI协议原理图字库芯片中文显示屏原理API的使用 SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行…

嵌入式要卷成下一个Java了吗?

嵌入式要卷成下一个Java了吗&#xff1f; 根据我十年的嵌入式开发经验&#xff0c;嵌入式开发的工资水平相对 Java 较低。不过&#xff0c;嵌入式开发岗位主要集中在第二产业&#xff0c;尤其是电器、电气、机械汽车、航空航天等行业的“智能制造”领域。这些行业属于重资产行…

JWT身份验证相关安全问题

前言&#xff1a;工作中需要基于框架开发一个贴近实际的应用&#xff0c;找到一款比较合适的cms框架&#xff0c;其中正好用到的就是jwt做身份信息验证&#xff0c;也记录一下学习jwt相关的安全问题过程。 JWT介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行…

线上自由DIY预约小程序源码系统 自由DIY你的界面 带完整的的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;移动应用成为人们生活和工作中不可或缺的一部分。预约小程序作为一种便捷的工具&#xff0c;为用户提供了高效的预约服务体验。而线上自由 DIY 预约小程序源码系统则为开发者和企业提供了更大的自由度和创造力&#xff0c;让他们能够根据…

Redis篇 String的基本命令

String基本命令 一.setnx,setex,psetex二. 增加删除命令三.append,setrange,getrange,strlen命令1.append2.setrange3.strlen4.getrange 四.String的内部编码方式 一.setnx,setex,psetex setex和psetex设置过期时间 setex设置的过期时间是秒级 psetex设置的过期时间是毫秒级 二…

11.任务状态查询API函数总结

一、任务相关 API 函数预览 二、任务相关 API 函数详解 1. 函数 uxTaskPriorityGet() 此函数用于获取指定任务的任务优先级&#xff0c;若使用此函数&#xff0c;需在 FreeRTOSConfig.h 文件中设 置配置项 INCLUDE_uxTaskPriorityGet 为 1&#xff0c;此函数的函数原型如下所示…

我和jetson-Nano的故事(12)——安装pytorch 以及 torchvision

在jetson nano中安装Anaconda、pytorch 以及 torchvision 1.Pytorch下载安装2.Torchvision安装 1.Pytorch下载安装 首先登录英伟达官网下载Pytorch安装包&#xff0c;这里以PyTorch v1.10.0为例 安装依赖库 sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev liba…