揭秘备忘录模式:打造灵活高效的状态管理解决方案

news2024/11/15 21:54:19

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。这种模式主要用于实现撤销操作。

在 Java 中,备忘录模式通常包括以下三个角色:

发起人(Originator):负责创建一个备忘录对象,用于存储其内部状态,并可以恢复之前的状态。
备忘录(Memento):负责存储发起人的内部状态。
管理者(Caretaker):负责保存和提供备忘录对象。
如下图:
在这里插入图片描述
以上的uml类图的示例代码:

// 发起人
public class Originator {
    private String state;

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

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void restoreStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 备忘录
public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

// 管理者
public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();

    public void addMemento(Memento memento) {
        mementos.add(memento);
    }

    public Memento getMemento(int index) {
        return mementos.get(index);
    }
}

使用示例:

public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("状态1");
        System.out.println("当前状态: " + originator.getState());
        caretaker.addMemento(originator.saveStateToMemento());

        originator.setState("状态2");
        System.out.println("当前状态: " + originator.getState());
        caretaker.addMemento(originator.saveStateToMemento());

        originator.setState("状态3");
        System.out.println("当前状态: " + originator.getState());
        caretaker.addMemento(originator.saveStateToMemento());

        // 恢复到状态2
        originator.restoreStateFromMemento(caretaker.getMemento(1));
        System.out.println("恢复到状态2: " + originator.getState());
    }
}

以下是一些适用备忘录模式的场景:

  • 实现撤销操作:在文本编辑器如Word中,用户可能需要撤销之前的输入或删除操作,备忘录模式可以用来保存每一步的编辑状态,使得用户能够通过Ctrl + Z来撤销操作。
  • 实现对象的历史记录功能:在需要记录对象历史状态的应用中,如游戏中的存档功能,备忘录模式可以用来保存游戏进度,允许玩家在稍后的时间点加载之前的游戏状态。
  • 保护对象封装性:当需要保存和恢复对象的状态,但又不希望暴露对象的内部实现细节时,备忘录模式提供了一种方式,可以在不破坏对象封装性的前提下进行状态管理。

总的来说,备忘录模式提供了一种灵活的方式来管理对象的状态,它允许对象在不暴露内部实现的情况下,保存和恢复其状态,这在很多应用程序中都是非常有用的。

优点:

  • 封装性良好:备忘录模式将状态保存和恢复的逻辑封装在备忘录对象中,使得客户端无需了解对象的内部实现细节。
  • 可撤销操作:提供了一种可以恢复到之前状态的机制,这在需要支持撤销操作的场景中非常有用。
  • 性能开销小:由于备忘录模式只存储对象的状态,而不是整个对象,因此在空间和时间上的开销较小。

缺点:

  • 占用额外空间:每个备忘录都会占用额外的内存空间来存储状态信息,如果备忘录的数量很多,可能会占用大量内存。
  • 维护成本:当原发器的状态结构发生变化时,可能需要修改备忘录类的相关代码,增加了维护成本。
  • 使用限制:备忘录模式通常要求原发器类具有较为简单的内部状态,如果内部状态非常复杂或者难以序列化,那么使用备忘录模式可能会变得困难。

与其他模式的关系

备忘录模式通常与行为型模式中的其他模式结合使用,以实现更复杂的功能。以下是一些备忘录模式与其他设计模式的运用方式:

  1. 与命令模式(Command Pattern)结合:命令模式用于将操作封装为对象,这样可以根据需要存储、传递和执行这些操作。在实现撤销功能时,可以结合使用备忘录模式和命令模式。当执行一个命令时,可以先创建一个备忘录来保存当前状态,然后再执行命令。如果需要撤销,可以从备忘录中恢复状态。
  2. 与原型模式(Prototype Pattern)结合:原型模式用于通过复制现有的实例来创建新的实例,而不是通过调用构造函数。在需要保存和恢复状态的场景中,可以使用原型模式来创建备忘录对象,这样可以避免每次都重新初始化备忘录对象。
  3. 与访问者模式(Visitor Pattern)结合:访问者模式允许在不修改类结构的情况下添加新的操作。当需要对备忘录对象进行不同的操作时,可以使用访问者模式来实现这些操作,而不需要修改备忘录对象的内部结构。
  4. 与单例模式(Singleton Pattern)结合:单例模式确保一个类只有一个实例,并提供一个全局访问点。在备忘录模式中,管理者(Caretaker)角色可以使用单例模式来实现,以确保整个系统中只有一个管理者负责备忘录的保存和恢复。
  5. 与工厂方法模式(Factory Method Pattern)结合:工厂方法模式用于创建一个对象的接口,让子类决定实例化哪一个类。在创建备忘录对象时,可以使用工厂方法模式来生成不同类型的备忘录,以便根据不同的需求保存不同的状态信息。
  6. 与策略模式(Strategy Pattern)结合:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。在恢复备忘录的状态时,可以使用策略模式来选择不同的恢复策略,例如根据用户的偏好或者系统的性能要求来选择不同的恢复方式。

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

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

相关文章

jmeter-03界面介绍

文章目录 主界面介绍工具栏介绍测试计划介绍线程组介绍线程组——选择测试计划&#xff0c;右键-->添加-->线程-->线程组1.线程数2.准备时长(Ramp-up)3.循环次数4.same user on each iteratio5.调度器 主界面介绍 工具栏介绍 新建测试计划&#xff1a;创建一个空白的测…

Django模型(四)

一、数据操作初始化 from django.db import models# Create your models here. class Place(models.Model):"""位置信息"""name = models.CharField(max_length=32,verbose_name=地名)address = models.CharField(max_length=64,null=True,verbo…

记录在树莓派中部署PI-Assistant开源项目(GPT语音对话)的BUG

核心 在部署PI-Assistant&#xff08;https://github.com/Lucky-183/PI-Assistant&#xff09;项目中&#xff0c;首先要进行环境安装&#xff0c;官网文档中提供的安装命令如下&#xff1a; pip install requests arcade RPi.GPIO pydub numpy wave sounddevice pymysql cn2…

Endnote常见设置(硕士毕业论文参考文献修改)

1、根据大多数期刊或学校使用的标准&#xff0c;英文名首字母大写后续字母小写。 2、需要手动调整Endnote中的参考文献相关内容 3、关于姓名大小写设置 AS IS是不更改大小写&#xff0c;EndNote库中文献的大小是什么样&#xff0c;Word中就显示什么样。选择Normal为首字母大…

【Langchain+Streamlit】打造一个旅游问答AI

利用LangchainStreamlit打造一个交互简单的旅游问答AI机器人&#xff0c;如果你有openai账号,可以按照如下的网址直接体验&#xff0c;如果你没有的话可以站内私信博主要一下临时key体验一下&#xff1a; 产品使用传送门—— http://101.33.225.241:8501/ 这里有演示效果和代码…

[word] word小数点对齐怎么设置 #微信#其他#其他

word小数点对齐怎么设置 使用Word编辑文档的时候&#xff0c;如果有小技巧的话&#xff0c;可以解决很多遇到的问题&#xff0c;也让工作更高效的完成&#xff0c;下面给大家分享word小数点对齐怎么设置的小技巧。 1、设置格式 选中内容&#xff0c;点击段落一一制表符&#…

86 SRC挖掘-教育行业平台规则批量自动化

目录 涉及资源&#xff1a; 专属SRC范围小&#xff0c;所以难度大一些 CNVD挖到的漏洞要有一些影响面&#xff0c;才能拿到证书 教育漏洞平台给的面是很大的&#xff0c;给很多目标&#xff0c;我们按照常规思路来讲的话&#xff0c;自己去手工测试和提交这些漏洞&#xff0c…

webpack源码分析——truncateArgs函数

一、truncateArgs 函数 函数功能 该函数可以用于用户界面中的文本截断&#xff0c;确保长文本在有限的显示空间内能够适当显示&#xff0c;并且用户可以了解到部分文本已被省略。 函数参数 args&#xff1a;参数数组。用于输出到界面上maxLength&#xff1a;当前界面上可容纳…

Vue基础知识七

一 路由 1.1 生活里的路由与路由器 是为了实现多台设备上网 1.2 程序里的路由与路由器 是为了实现导航区与展示区来回切换&#xff1b; SPA单页面应用&#xff1a;就像前几章节里的项目&#xff0c;整个项目只有一个html文件&#xff1b; 案例 注意&#xff0c;最开始的时候…

嵌入式——串行外围设备接口(SPI)

目录 一、初识SPI 1. 介绍 2. 特性 补&#xff1a; 二、物理层 1. SS &#xff08;Slave Select&#xff09; 2. SCK &#xff08;Serial Clock&#xff09; 3. MOSI &#xff08;Master Output, Slave Input&#xff09; 4. MISO &#xff08;Master Input&#xff0…

AI助力农作物自动采摘,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建作物番茄采摘场景下番茄成熟度检测识别分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

Python机器学习库(numpy库)

文章目录 Python机器学习库&#xff08;numpy库&#xff09;1. 数据的维度2. numpy基础知识2.1 numpy概述2.1 numpy概述2.1 numpy概述2.2 numpy库的引用 3. ndarray数组的创建3.1 N维数组对象ndarray3.2 创建ndarray数组3.2.1 使用Python列表、元组创建ndarray数组3.2.2 使用nu…

C++ 动态规划 线性DP 数字三角形

给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和最大。 73 8 8 1 02 7 4 4 4 5 2 6 5 输入格式 …

Quick BI中lod函数之lod_include

一、lod函数简介 LOD函数的全称是详细级别表达式&#xff08;Level Of Detail Expressisons&#xff09;。它主要是为了克服一些表达式之间计算颗粒度不一致的问题。比如&#xff0c;要计算第一季度各月销售收入占比&#xff0c;这里分子计算颗粒度为’月’&#xff0c;但是分…

栈的应用:括号匹配问题_有效的括号

假设表达式中允许包含两种括号&#xff1a;圆括号和方括号&#xff0c;嵌套顺序要求&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 考虑下列括号序列&#xff1a; 分析如下&#xff1a; 计算机…

stable diffusion学习笔记——高清修复

ai画图中通常存在以下痛点&#xff1a; 受限于本地设备的性能&#xff08;主要是显卡显存&#xff09;&#xff0c;无法跑出分辨率较高的图片。生图的时候分辨率一调大就爆显存。即便显存足够。目前主流的模型大多基于SD1.0和SD1.5&#xff0c;这些模型在训练的时候通常使用小…

机器学习-基础分类算法-KNN详解

KNN-k近邻算法 k-Nearest Neighbors 思想极度简单应用数学只是少效果好可以解释机器学习算法使用过程中的很多细节问题更完整的刻画机器学习应用的流程 创建简单测试用例 import numpy as np import matplotlib.pyplot as plt raw_data_X [[3.393533211, 2.331273381],[3.1…

单片机学习笔记---定时器和中断系统如何连起来工作

前面两节我们分别讲了中断系统和定时器&#xff0c;这节我们看看这两者连起来工作的原理。 说明&#xff1a;看这一节之前一定要先把前两节给看明白了再仔细琢磨这一节的每一张图&#xff01; 前两节&#xff1a; 单片机学习笔记---中断系统&#xff08;含外部中断&#xff…

Python基础知识:Python注释及print函数、input函数

在Python中&#xff0c;注释是对相应代码的解释&#xff0c;以增加代码的可读性&#xff0c;让用户能够更好地理解相应代码的含义。注释通过在相应代码后面加上“#”号来实现。比如以下代码 data.describe()#对数据集进行描述性分析 其中data.describe()为需要被执行的代码&a…

网络安全之漏洞扫描

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用&#xff0c;从而对一个组织的资产或运行造成不利影响&#xff0c;如信息系统被攻击或控制…