当前位置: 首页 > news >正文

java实现备忘录模式

备忘录模式是一种行为设计模式,它允许您捕获一个对象的内部状态,并在稍后的时间点将其恢复。这对于需要撤销操作或恢复到先前状态的应用程序非常有用。以下是在 Java 中实现备忘录模式的一般步骤:

  1. 创建一个原发器类(Originator):这是需要保存状态的类。它包含了要保存和恢复的状态信息。

  2. 创建一个备忘录类(Memento):这个类保存原发器的状态信息,并且只能由原发器本身访问。

  3. 创建一个负责人类(Caretaker):这个类负责保存备忘录对象,以便稍后可以恢复状态。

现在,让我们通过一个示例来实现备忘录模式:

// 步骤 1: 创建原发器类
class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveToMemento() {return new Memento(state);}public void restoreFromMemento(Memento memento) {state = memento.getState();}
}// 步骤 2: 创建备忘录类
class Memento {private final String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// 步骤 3: 创建负责人类
class Caretaker {private Memento memento;public void saveMemento(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}
}// 示例
public class Main {public static void main(String[] args) {// 创建原发器Originator originator = new Originator();// 创建负责人Caretaker caretaker = new Caretaker();// 设置原发器的状态并保存备忘录originator.setState("状态1");caretaker.saveMemento(originator.saveToMemento());// 修改原发器的状态originator.setState("状态2");// 恢复原发器到先前状态originator.restoreFromMemento(caretaker.getMemento());// 输出原发器的当前状态System.out.println("当前状态: " + originator.getState()); // 输出 "当前状态: 状态1"}
}

在这个示例中,原发器(Originator)类保存了一个状态,可以通过 saveToMemento 方法保存状态到备忘录(Memento)对象,然后通过 restoreFromMemento 方法从备忘录对象中恢复状态。负责人(Caretaker)类负责管理备忘录对象,保存和恢复原发器的状态。

备忘录模式可以用于保存对象的状态历史,以便在需要时回滚到之前的状态。这在实现撤销、恢复或历史记录功能时非常有用。

相关文章:

java实现备忘录模式

备忘录模式是一种行为设计模式,它允许您捕获一个对象的内部状态,并在稍后的时间点将其恢复。这对于需要撤销操作或恢复到先前状态的应用程序非常有用。以下是在 Java 中实现备忘录模式的一般步骤: 创建一个原发器类(Originator&am…...

aardio语言的通用数据表维护

import win.ui; /*DSG{{*/ var winform win.form(text"通用数据表维护";right617;bottom427;bgcolor15780518) winform.add( buttonAdd{cls"button";text"增加空行";left469;top40;right564;bottom80;flat1;z2}; buttonDel{cls"button&quo…...

手写RPC框架--7.封装响应

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 封装响应 封装响应a.封装响应b.请求id生成器(雪花算法)c.抽象序列化d.建立序列化工厂e.hessian的序列化方式(拓展) 封装响应 a.封装响应 在core模块…...

Linux入门教程||Linux系统目录结构

登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里存放的是启动Linux时…...

LeetCode 88. 合并两个有序数组

文章目录 一、题目二、C# 题解 一、题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意&a…...

C语言实现扫雷小游戏

1.首先扫雷游戏要存储布置好的雷信息,需要一个二维数组 不是雷放* 雷:# 不是雷:0 雷:1 2. 给2个二维数组 9*9 一个存放雷的信息,一个存放布置好雷的信息 3.为了防止在统计坐标周围的…...

【linux基础(五)】Linux中的开发工具(上)---yum和vim

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux中的开发工具 1. 前言2.…...

C++学习之list的实现

在了解学习list实现之前我们首先了解一下关于迭代器的分类: 按功能分类: 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 按性质分类: 单向迭代器 只能 例如单链表 双向迭代器 可,也可-- 例如双…...

一种高效且节约内存的聚合数据结构的实现

一种高效且节约内存的聚合数据结构的实现 在特定的场景中,特殊定制数据结构能够得到更加好的性能且更节约内存。 聚合函数GroupArray的问题 GroupArray聚合函数是将分组内容组成一个个数组,例如下面的例子: SELECT groupArray(concat(ABC…...

机器学习(10)---特征选择

文章目录 一、概述二、Filter过滤法2.1 过滤法说明2.2 方差过滤2.3 方差过滤对模型影响 三、相关性过滤3.1 卡方过滤3.2 F检验3.3 互信息法3.4 过滤法总结 四、Embedded嵌入法4.1 嵌入法说明4.2 以随机森林为例的嵌入法 五、Wrapper包装法5.1 包装法说明5.2 以随机森林为例的包…...

Python之数据库(MYSQL)连接

一)数据库SQL语言基础 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database…...

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网以搭建WordPress网站博客为例,阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…...

【自然语言处理】关系抽取 —— MPDD 讲解

MPDD 论文信息 标题:MPDD: A Multi-Party Dialogue Dataset for Analysis of Emotions and Interpersonal Relationships 作者:Yi-Ting Chen, Hen-Hsen Huang, Hsin-Hsi Chen 期刊:LREC 2020 发布时间与更新时间:2020 主题:自然语言处理、关系抽取、对话场景、情感预测 数…...

深入理解JVM虚拟机第三篇:JVM的指令集架构模型和JVM的生命周期

文章目录 一:JVM的指令集架构模型 1:基于栈式架构的特点...

[小尾巴 UI 组件库] 组件库配置与使用

文章归档于:https://www.yuque.com/u27599042/row3c6 组件库地址 npm:https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee:https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…...

Linux系统中fork()函数的理解

fork() 函数是一个在Unix和类Unix操作系统中常见的系统调用,用于创建一个新的进程,该进程是调用进程(父进程)的副本。fork() 函数的工作原理如下: 1. 当父进程调用 fork() 时,操作系统会创建一个新的进程&a…...

Linux网络编程:网络协议及网络传输的基本流程

目录 一. 计算机网络的发展 二. 网络协议的认识 2.1 对于协议分层的理解 2.2 TCP/IP五层协议模型 2.3 OSI七层模型 三. 网络传输的流程 3.1 同一网段中计算机通信的流程 3.2 不同网段中计算机设备的通信 3.3 对于IP地址和MAC地址的理解 3.4 数据的封装和解包 四. 总结…...

【大数据之Kafka】十、Kafka消费者工作流程

1 Kafka消费方式 (1)pull(拉)模式:消费者从broker中主动拉取数据。(Kafka中使用) 不足:如果Kafka中没有数据,消费者可能会陷入循环,一直返回空数据。 &#…...

如何确保ChatGPT的文本生成对特定行业术语的正确使用?

确保ChatGPT在特定行业术语的正确使用是一个重要而复杂的任务。这涉及到许多方面,包括数据预处理、模型训练、微调、评估和监控。下面我将详细介绍如何确保ChatGPT的文本生成对特定行业术语的正确使用,并探讨这一过程中的关键考虑因素。 ### 1. 数据预处…...

行业追踪,2023-09-11

自动复盘 2023-09-11 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...

滑动窗口(数组)

作用滑动窗口&#xff1a;求连续满足条件的最短子数组代码模板int left 0; int right;//外层循环扩展右边界&#xff0c;内层循环扩展左边界 for (right 0; right < n; right) {//获取当前考虑的元素while (left < right && check()) {//区间[left,right]不符合…...

Python统一调用多AI模型:python-tgpt库实战指南

1. 项目概述&#xff1a;一个让Python与AI对话更简单的工具 如果你最近在尝试用Python调用各种大语言模型&#xff08;LLM&#xff09;的API&#xff0c;比如OpenAI的GPT、Google的Gemini&#xff0c;或者开源的Llama、Mistral&#xff0c;那你大概率经历过这样的场景&#xf…...

【无人船】A星算法融合DWA限制内陆水域无人水型导航路径规划【含Matlab源码 15445期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…...

从弹簧振子到无人机建模:手把手用Matlab ode45搭建你的第一个动力学仿真模型

从弹簧振子到无人机建模&#xff1a;用Matlab ode45构建动力学仿真全流程指南 1. 动力学仿真&#xff1a;连接物理世界与数字模型的桥梁 在工程实践中&#xff0c;我们常常需要预测一个系统随时间变化的行为——无论是弹簧的振动周期、无人机的飞行轨迹&#xff0c;还是机械臂的…...

CH32F103C8T6 vs STM32F103C8T6:程序下载生态深度对比与国产替代实战

CH32F103C8T6与STM32F103C8T6程序下载生态全维度对比与国产化迁移指南 在嵌入式开发领域&#xff0c;MCU的程序下载方式往往决定了开发效率的上限。当工程师从熟悉的STM32平台转向国产CH32时&#xff0c;最直接的"水土不服"往往就发生在烧录环节——同样的SWD接口为何…...

Battle City碰撞检测算法:精准命中与躲避的核心技术解析

Battle City碰撞检测算法&#xff1a;精准命中与躲避的核心技术解析 【免费下载链接】battle-city &#x1f3ae; Battle city remake built with react. 项目地址: https://gitcode.com/gh_mirrors/ba/battle-city 在经典的Battle City坦克大战游戏中&#xff0c;碰撞检…...

NS-USBLoader完整指南:Switch文件管理、RCM注入与游戏传输的一站式解决方案

NS-USBLoader完整指南&#xff1a;Switch文件管理、RCM注入与游戏传输的一站式解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://…...

QGIS图层驾驭术 | 新手必会的三大核心操作

1. 图层基础&#xff1a;理解QGIS的"透明胶片"逻辑 第一次打开QGIS时&#xff0c;看到空白的画布和一堆按钮&#xff0c;很多人会感到无从下手。其实理解图层概念最简单的方式&#xff0c;就是想象你在用传统方法制作地图&#xff1a;把不同内容的透明胶片叠在一起。…...

ARM指令集优化:MVN、ORR与PLD指令深度解析

1. ARM指令集基础与优化技术概览在嵌入式系统和低功耗计算领域&#xff0c;ARM架构凭借其精简高效的指令集设计占据了主导地位。作为ARMv7/v8架构的核心组成部分&#xff0c;逻辑运算指令和内存预取指令对程序性能有着决定性影响。MVN&#xff08;位取反&#xff09;、ORR&…...

IEC 61850开源库终极指南:5步构建工业级电力通信系统

IEC 61850开源库终极指南&#xff1a;5步构建工业级电力通信系统 【免费下载链接】libiec61850 Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850 libiec61850 是一…...