描述Java中的备忘录模式。

备忘录模式(Memento Pattern)是软件工程中的一种设计模式,属于行为型模式。它主要用于在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后可以将对象恢复到原先保存的状态。

### 备忘录模式的组成部分

1. **Originator(发起人)**:负责创建一个备忘录,用以记录当前对象的内部状态,并可以利用备忘录恢复到先前的状态。

2. **Memento(备忘录)**:负责存储Originator对象的内部状态,并可以防止Originator的外部对象直接访问其内部状态。

3. **Caretaker(管理者)**:负责保存好备忘录,当需要恢复Originator的状态时,负责将备忘录传递给Originator。

### 备忘录模式的使用场景

- 当需要保存对象的状态,并允许对象在不同时间点有不同的状态时。
- 当不希望外界直接访问对象的内部状态时。

### 备忘录模式的实现

在Java中,备忘录模式可以通过以下方式实现:

```java
// 发起人角色
class Originator {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    // 创建备忘录
    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    // 恢复到备忘录中的状态
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 备忘录角色
class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

// 管理者角色
class Caretaker {
    private Memento memento;

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

    public Memento getMemento() {
        return memento;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setState("State #1");

        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.saveStateToMemento());

        // 改变状态
        originator.setState("State #2");

        // 恢复到先前的状态
        originator.getStateFromMemento(caretaker.getMemento());
    }
}
```

### 备忘录模式的优点

- 保护了对象的内部状态,使其外部不能直接访问。
- 提供了一种存储对象状态的机制,使得对象可以恢复到先前的状态。

### 备忘录模式的缺点

- 增加了系统中对象的数量,每个Originator对象都需要一个相应的Memento对象。
- 对于复杂的对象状态,Memento对象可能会变得复杂。

### 总结

备忘录模式是一种通过保存对象状态来实现对象状态恢复的模式,它有助于实现软件的可逆操作。在Java中,备忘录模式常用于需要撤销和重做功能的应用程序,如文本编辑器或图形编辑软件。通过合理使用备忘录模式,可以提高软件的灵活性和可维护性。

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

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

相关文章

面试二十二、跳表SkipLists

跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图&…

南都电源:以技术创新引领储能行业新发展

随着全球能源结构的深刻变革,储能行业正迎来前所未有的发展机遇。在这个充满挑战与机遇的时代,南都电源以其深厚的技术底蕴和前瞻的战略视野,成为储能行业的佼佼者。近日发布的2023年度业绩报告,更是彰显了其在行业内的领先地位和…

嵌入式UBoot如何跳转Kernel—uboot与linux交界分析

不知道你是否有这种感觉,就是学习了Uboot,学习了kernel,学习了安卓。但是有时候总感觉是各自孤立的,将三者连续不起来? • 不知道你是否在做启动方案的时候,在宏观上知道了整个启动链路流程,但是却在汪洋的代码中迷了路? 那么这篇文章必定对你有点用处。 如果没有,那请…

技术速递|MSTest SDK 简介 – 改进的配置和灵活性

作者:Marco Rossignoli & Amaury Lev 排版:Alan Wang 我们很高兴地宣布,基于 MSBuild Project SDK 系统构建的全新 MSTest SDK已推出。它旨在通过合理的默认值和灵活的选项使项目配置更加容易,从而为您提供更好的 MSTest 测试…

javabean技术四种方法

1.form表单 index页面 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!-- jsp页面输入三角形三条边&#xff0c;输出周长和面积 --><!-- 实例化对象bean的名字可以随便取名&#xff0…

人工智能与汽车行业的定量分析研究

人工智能与汽车行业的定量分析研究 摘要&#xff1a;[论文摘要] 关键词&#xff1a;[论文关键词] 一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经深入到各个行业领域&#xff0c;汽车行业亦不例外。AI与汽车行业的结合&#xff0c;不…

Nginx基本使用 反向代理与负载均衡

什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;而且几乎可以做到7*24不间断运行&#xff0c;即使运行数个月也不需要重新启动。 …

MP2110A Anritsu 安立 采样示波器 眼图设备 简述

MP2110A是一款集成了误码率测试仪&#xff08;BERT&#xff09;和采样示波器的一体化测量仪器&#xff0c;主要用于光学模块的误码率&#xff08;BER&#xff09;测量、眼图分析等评估操作。它支持从10G到800G的光学模块制造过程中的检测分91522。MP2110A内置4通道采样示波器&a…

MySQL从安装、配置到日常操作和管理的关键步骤

MySQL是一款广泛使用的开源关系型数据库管理系统&#xff0c;用于存储、管理、检索和处理数据。以下是一个详细的MySQL使用教程&#xff0c;包括安装、基本操作、数据管理、权限控制、备份与恢复等方面的内容&#xff1a; 一、MySQL安装 下载&#xff1a; 访问MySQL官方网站&a…

k8s部署jupyterlab,jupyterlab保存不了文件,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

磁盘分区以及MBR与GPT

磁盘分区以及MBR与GPT 磁盘分区的概念MBR&#xff08;Master Boot Record&#xff09;与GPT&#xff08;GUID Partition Table&#xff09;分区命令LinuxWindows 磁盘分区的概念 磁盘分区是将一个物理硬盘驱动器划分为多个逻辑部分的过程。每个分区可以看作是一个独立的硬盘&a…

ElasticSearch:查询操作合集

先看下我的数据&#xff1a; 1、查询所有文档&#xff1a; GET /cartest/_search或者 GET /cartest/_search {"query": {"match_all": {}} }2、匹配查询&#xff1a; match匹配类型查询&#xff0c;会把查询条件进行分词&#xff0c;然后进行查询&…

【树莓派】如何用电脑连接树莓派的远程桌面,灰屏解决

要使用VNC桌面连接到树莓派&#xff0c;你需要确保已经安装并启动了VNC服务器。以下是连接到树莓派的步骤&#xff1a; 在树莓派上启动VNC服务器&#xff1a; 打开终端或SSH连接到你的树莓派。输入以下命令以安装RealVNC的VNC服务器&#xff1a;sudo apt update sudo apt insta…

PLSQL数据库

目录 什么是PLSQL数据库 PL数据库的实现方法 PL数据库的基本语法 1.作用 2.语法 3.赋值输出 4.引用 5.异常处理 6.if 判断 7.loop循环 8.while循环 9.for循环 10.游标 11.参数游标 12.索引 13.分区表 什么是PLSQL数据库 PL/SQL&#xff08;Procedure Language/…

微前端通信机制及其实现

微前端通信机制是指在微前端架构中&#xff0c;不同的微应用之间进行通信的方式和机制。微前端通信机制的实现可以通过以下几种方式&#xff1a; 事件总线&#xff08;Event Bus&#xff09;&#xff1a;微前端架构中的主应用可以创建一个事件总线&#xff0c;用于发布和订阅事…

【C++航海王:追寻罗杰的编程之路】C++11(二)

目录 C11(上) 1 -> STL中的一些变化 2 -> 右值引用和移动语义 2.1 -> 左值引用和右值引用 2.2 -> 左值引用与右值引用比较 2.3 -> 右值引用使用场景与意义 2.4 -> 右值引用引用左值及其更深入的使用场景分析 2.5 -> 完美转发 C11(上) 1 -> STL…

为什么要建设数字化校园?

数字化校园的建设能够使用户能够随时随地的在有互联网的地方获取到校园的信息&#xff0c;而且由于这些信息都是有校园的管理部门发布的&#xff0c;所以这样就能保证信息的权威性。数字化校园平台还能让学校内部建立起相对独立的网络体系&#xff0c;能有效的消除“信息化孤岛…

Leetcode 3121. Count the Number of Special Characters II

Leetcode 3121. Count the Number of Special Characters II 1. 解题思路2. 代码实现 题目链接&#xff1a;3121. Count the Number of Special Characters II 1. 解题思路 这一题算是一个分类讨论的问题吧&#xff0c;我们只需要对每一个字符考察其前序当中所有出现过的字符…

Qt实现XYModem协议(四)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

Leetcode 4.21

1.罗马数字转整数 用unordered_map去存罗马数字对应的数值&#xff0c;分情况讨论&#xff0c;把所有情况都列出来即可 class Solution { public:unordered_map<char, int> mp {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000}};int romanToInt(string s)…