【重温设计模式】备忘录模式及其Java示例

备忘录模式的概述

在软件设计的世界中,备忘录模式是一种行为设计模式,它的主要作用是保存对象的当前状态,以便在将来的某个时间点,可以将对象恢复到这个保存的状态。这种模式的命名源于生活中的备忘录,我们常常用它来记录一些重要的信息,以防忘记。

在编程中,备忘录模式的重要性不言而喻。想象一下,你正在编写一个复杂的程序,用户可能会进行一系列的操作,然后突然想要撤销某个操作。如果没有备忘录模式,你可能需要手动跟踪用户的每一个操作,然后编写复杂的代码来撤销这些操作。但是,有了备忘录模式,你只需要在每次操作前保存一下当前的状态,然后在需要撤销操作时,直接恢复到之前保存的状态即可。

接下来,我们将详细解释备忘录模式的三个主要组成部分:发起人、备忘录和管理者,以及他们各自的职责和角色。

备忘录模式的组成部分

在我们深入探讨备忘录模式的内部机制之前,我们需要了解其三个主要的组成部分:发起人、备忘录和管理者。每个部分都有其特定的职责和角色,他们的协同工作使得备忘录模式能够正常运作。

首先,发起人是我们想要保存状态的对象。它可以创建一个包含其当前内部状态的备忘录,并在需要时使用备忘录恢复其内部状态。在Java中,我们可以通过定义一个发起人类来实现这一角色。例如,我们可以创建一个名为OneMore的类,该类有一个state字段用于保存其状态,以及createMemento()restoreMemento()方法用于创建备忘录和恢复状态。

public class OneMore {private String state;public Memento createMemento() {return new Memento(state);}public void restoreMemento(Memento memento) {this.state = memento.getState();}
}

其次,备忘录是一个用于保存发起人对象状态的对象。它只能被发起人访问,但不能被其他对象访问。在Java中,我们可以通过定义一个备忘录类来实现这一角色。例如,我们可以创建一个名为Memento的类,该类有一个state字段用于保存发起人的状态。

最后,管理者负责保存备忘录,但不能对备忘录的内容进行操作或检查。在Java中,我们可以通过定义一个管理者类来实现这一角色。例如,我们可以创建一个名为Caretaker的类,该类有一个memento字段用于保存备忘录。

通过这三个角色的互动,我们可以在任何时候保存对象的状态,并在需要时恢复到之前的状态。接下来,我们将通过一个具体的例子来看看如何在Java中实现备忘录模式。

Java中的备忘录模式实例

在Java中,我们可以通过具体的代码来实现备忘录模式。以文本编辑器为例,用户可能会对一段文字进行很多次修改。在这种情况下,我们可以使用备忘录模式来保存当前文本的状态。

首先,我们需要创建一个名为OneMoreEditor的“发起人”类,这是我们想要保存状态的对象。这个类中,我们需要有一个content字段来保存当前的文本状态,以及一个createMemento()方法来创建备忘录,一个restore(Memento memento)方法来恢复状态。

public class OneMoreEditor {private String content;public Memento createMemento() {return new Memento(content);}public void restore(Memento memento) {this.content = memento.getContent();}// other methods...
}

接着,我们需要一个名为Memento的“备忘录”类,它可以保存“发起人”的状态。这个类中,我们需要有一个content字段来保存状态,以及一个getContent()方法来获取状态。

public class Memento {private String content;public Memento(String content) {this.content = content;}public String getContent() {return content;}
}

最后,我们需要一个名为Caretaker的“看护人”类,它可以保存备忘录,并在需要时将“发起人”的状态恢复到备忘录中的状态。这个类中,我们需要有一个memento字段来保存备忘录,以及一个saveMemento(Memento memento)方法来保存备忘录,一个getMemento()方法来获取备忘录。

public class Caretaker {private Memento memento;public void saveMemento(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}
}

这样,我们就实现了一个简单的备忘录模式。

create
use
use
OneMoreEditor
-String content
+createMemento()
+restore(Memento memento)
Memento
-String content
+Memento(String content)
+getContent()
Caretaker
-Memento memento
+saveMemento(Memento memento)
+getMemento()

用户可以通过OneMoreEditor进行文本编辑,通过Caretaker保存和恢复状态。但是,备忘录模式并非完全无懈可击,它同样有其优点和缺点,这需要我们在实际开发中根据实际需求进行选择。

备忘录模式的优缺点

备忘录模式,如同一位细心的记事人,为我们的软件设计提供了一种保存和恢复对象状态的机制。如同世间万物,它也有其优点和缺点,理解这些,可以帮助我们在实际开发中更好的选择和使用。

首先,让我们来看看备忘录模式的优点。备忘录模式的最大优点就是它可以保持封装的完整性。备忘录有两个接口,一个是宽接口,对发起人开放,允许其访问所有信息;另一个是窄接口,对其他对象开放,只允许其看到备忘录的保留接口。这样,除了发起人,其他对象无法访问备忘录的内部信息,从而保证了封装的完整性。

然后,我们来看看备忘录模式的缺点。备忘录模式的主要缺点在于资源消耗。因为每次保存状态都需要创建一个备忘录对象,如果我们需要保存大量的状态信息,或者需要频繁地保存状态,那么这将消耗大量的内存资源。

在实际开发中,我们是否选择使用备忘录模式,需要根据实际需求来决定。如果我们的系统需要提供撤销操作,或者需要保存对象的某个历史状态,备忘录模式是一个很好的选择。但是,如果系统资源紧张,或者不需要保存状态,我们就应该避免使用备忘录模式。

总结

备忘录模式,就像一个时间机器,让我们可以自由地穿梭在时间的长河中。但是,每一次的穿梭,都会消耗一部分的资源。因此,我们需要明智地使用这个模式,根据实际的需求来决定是否需要保存状态,以及何时保存状态。如果我们过于频繁地保存状态,可能会消耗大量的资源,导致系统的性能下降。但是,如果我们能够合理地使用这个模式,它将会是我们的强大工具。

没有完全正确或者完全错误的设计模式,只有适合或者不适合的使用场景。备忘录模式,就是这样一个有优点也有缺点的设计模式。它能够帮助我们保存和恢复对象的状态,但同时也需要消耗一定的资源。因此,我们在使用这个模式时,需要根据实际的需求和资源情况来做出决定。

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

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

相关文章

俄罗斯方块h5源码

上传源码至服务器和空间即可使用,源码无后门,就一天html文件,一个两个css文件以及一个js文件 源码下载:https://download.csdn.net/download/m0_66047725/88897605 更多资源下载:关注我。

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点: https://ai.uaai.cn 技能模块 官方论坛: www.jingyuai.com 京娱AI 导读:在使用 ChatGPT 时,当你给的指令越精确,它的回答会越到位,举例来说,假如你要请它帮忙写文案,如…

devops-Maven【部署及配置】

1、准备maven工具包,Maven官网下载Maven的安装包 Maven – Download Apache Maven Index of /maven (apache.org) 选择后缀是.bin.tar.gz的文件下载,此处下载的版本是3.9.6。 2、安装maven的目录下,建一个Maven路径,然后把压缩…

JAVA虚拟机实战篇之内存调优[5](诊断和解决问题-两种方式总结)

文章目录 版权声明诊断和解决问题 - 两种方案在线定位问题步骤在线定位问题 – btrace 总结内存溢出&内存泄漏内存溢出原因解决内存泄漏方法 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明:正弦波。x:NumPy数组 # 所有的数据,进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

746. 使用最小花费爬楼梯 (Swift版本)

题目 给你一个整数数组 cost,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 限制条件 2…

智能合约语言(eDSL)—— proc_macro实现合约init函数

我们通过属性宏来实现合约的init函数,call函数其实和init是类似的; GitHub - XuHugo/xwasm 构建属性宏,要在cargo.toml里面设置一些参数,这是必须的。一般来说,过程宏必须是一个库,或者作为工程的子库&…

thingsboard如何自定义udp-transport

0、参考netty实现udp的文章 https://github.com/narkhedesam/Netty-Simple-UDP-TCP-server-client/blob/master/netty-udp/src/com/sam/netty_udp/server/MessageDecoder.java 调试工具使用的是:卓岚TCP&UDP调试工具 1、在common\transport下面创建udp模块,仿照mqtt的创…

Linux配置.bashrc文件导致各种命令(vim、sudo)失效。

Linux配置.bashrc文件导致各种命令(vim、sudo)失效。 起因是 nvcc-V一直报错:-bash:nvcc: command not found 踩坑记录:上网一查说是没有配置cuda的环境变量。于是去修改了bashrc文件,在最下面…

一次生产环境上的dockerd启动失败原因分析

今夜原计划对 生产环境 上的 SDN 组件进行一次紧急扩容操作的,但业务基础环境中的 Docker-Engine 启动不起来了、原定计划也就无法继续进行了。 尽管查清了基础业务环境中的故障原因,但金主DD说今天先不干了,那就整理整理思路写篇流水账吧 。…

【漏洞复现】帮管客 CRM jiliyu SQL注入漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

ubuntu下vscode+STM32CubeMX+openocd+stlinkv2搭建STM32开发调试下载环境

1、换源 清华源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restr…

nginx-排查一次大文件无法正常下载问题

目录 问题现象&报错信息 问题现象以及分析 nginx报错信息 问题解决 方法1:配置proxy_max_temp_file_size 方法2:关闭proxy_buffering 参考文档 问题现象&报错信息 问题现象以及分析 文件正常从后端服务器直接下载时,一切正常…

通过esp32cam拍摄图片上传至PC并通过YOLO进行目标检测

通过esp32cam拍摄图片上传至PC并通过YOLO进行目标检测 一.通过esp32cam拍摄照片并上传至PC二.训练自己的数据集三.AutoDL AI算力云的使用1.账号注册2.GPU选取3.GPU使用4.开机训练 四.数据集的使用 一.通过esp32cam拍摄照片并上传至PC 文章链接: https://blog.csdn.net/qq_6297…

北京市气象站点日值数据(降雨气温风速日照蒸发气压地温湿度)

气象数据一直是一个价值较高的数据,它被广泛用于各个领域的研究当中。气象数据包括有气温、气压、相对湿度、降水、蒸发、风向风速、日照等多种指标,但是包含了这些全部指标的气象数据却较难获取,即使获取到了也不能随意分享。 北京&#xf…

学习JavaEE日子 Day24 TreeSet,内置比较器,外置比较器,HashMap

Day24 TreeSet 1.TreeSet 1.1 TreeSet的使用 注意&#xff1a;TreeSet的使用和HashSet一样 public class Test01 {public static void main(String[] args) {//创建TreeSet集合的对象TreeSet<String> set new TreeSet<>();//添加元素set.add("麻生希"…

机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析

一、引言 机器学习在当今社会扮演着日益重要的角色&#xff0c;但黑盒模型的不可解释性限制了其应用范围。因此&#xff0c;可解释性机器学习成为研究热点&#xff0c;有助于提高模型的可信度和可接受性。本文旨在探讨随机森林和fastshap作为可视化模型解析工具的应用&#xff…

【生态适配】亚信安慧AntDB数据库与OpenCloudOS、TencentOS Server五款产品完成兼容互认

日前&#xff0c;亚信安慧AntDB数据库与OpenCloudOS8、OpenCloudOS9、TencentOS Server 2、TencentOS Server 3、TencentOS Server 4五款操作系统完成兼容互认。经过严格测试&#xff0c;亚信安慧AntDB数据库与这五款操作系统兼容良好&#xff0c;整体运行稳定。 图1&#xff1…

在Anaconda3的conda中创建虚拟环境下载opencv

opencv下载全流程 一、下载Anaconda 记得从官方网格站进行下载&#xff0c;会有一些慢 下载后进行配置 b站讲解视频&#xff08;非本人&#xff08;平台大神讲解&#xff09;&#xff09; 二、打开conda控制台 这里的两个都可以进行下载 通常我们受用anaconda prompt 三、…

数字人ai直播软件突破AI大模型技术,改变未来科技格局!

数字人AI直播软件在AI大模型技术上的突破&#xff0c;将不可避免地改变未来科技格局。这一突破让人们看到了AI技术的无限可能性&#xff0c;并为未来的科技发展打开了新的大门。 AI大模型技术是近年来人工智能领域的一个热点&#xff0c;它通过构建庞大、复杂的神经网络模型&a…