23种设计模式之备忘录模式(Memento Pattern)

news2024/11/25 7:32:52

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的备忘录模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

文章目录

  • 备忘录模式概念
  • 备忘录模式角色
  • 备忘录模式优缺点
  • 备忘录模式案例

备忘录模式概念

备忘录模式(Memento Pattern)是一种行为型设计模式。该模式允许在不暴露对象实现细节的情况下,将对象恢复到之前的状态。

备忘录模式角色

备忘录模式由三个核心角色组成:

发起人(Originator):发起人是具有要恢复状态的对象。它定义了创建备忘录对象的方法,以便在需要时使用这些备忘录来恢复对象的先前状态。

备忘录(Memento):备忘录对象是用于保存发起人对象状态的容器。它通常只存储发起人的状态信息,而不包括任何关于状态如何被捕获或恢复的实现细节。

管理者(Caretaker):管理者负责管理备忘录对象,并且只能对它们进行保存和恢复的操作。管理者可以对备忘录执行操作,但是不能查看或修改其内容。

在备忘录模式中,当发起人需要保存旧状态时,它会向管理者请求一个备忘录对象。管理者返回一个新的备忘录对象,并将当前状态保存在其中。如果在之后需要恢复状态时,发起人将这个备忘录对象还原为旧状态,这个备忘录对象将包含旧的状态信息。

备忘录模式优缺点

备忘录模式的优点是它可以让发起人对象有更好的封装性,因为它不需要暴露其实现细节;同时,备忘录对象的存储和恢复操作对发起人对象是透明的,从而减少了耦合。然而,使用备忘录模式可能会带来一些开销,尤其是在需要恢复大量状态信息时。

备忘录模式常见的应用场景包括文本编辑器的撤销操作、数据库事务回滚、游戏存档等等。

备忘录模式案例

接着通过一个案例来学习一下备忘录模式:

首先创建发起人类(Originator)

public class Originator {

    private String state;

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

    public String getState() {
        return state;
    }

    /**
     * 将当前状态存储到备忘录中
     */
    public Memento createMemento() {
        return new Memento(state);
    }

    /**
     * 从备忘录中恢复状态
     */
    public void restoreFromMemento(Memento memento) {
        state = memento.getState();
    }

}

接着创建备忘录类(Memento)

public class Memento {

    private final String state;

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

    public String getState() {
        return state;
    }

}

创建负责人类(Caretaker)

public class Caretaker {

    private Memento memento;

    /**
     * 存储备忘录
     */
    public void storeMemento(Memento memento) {
        this.memento = memento;
    }

    /**
     * 获取备忘录
     */
    public Memento retrieveMemento() {
        return memento;
    }

}

然后测试代码

public class MementoPatternDemo {

    public static void main(String[] args) {
        Originator originator = new Originator(); // 创建发起人对象
        Caretaker caretaker = new Caretaker(); // 创建负责人对象

        originator.setState("State1"); // 设置状态
        caretaker.storeMemento(originator.createMemento()); // 将备忘录存储到负责人中

        originator.setState("State2"); // 改变状态

        // 从备忘录恢复当前状态
        originator.restoreFromMemento(caretaker.retrieveMemento());

        System.out.println("Current state: " + originator.getState());
    }

}

运行结果为:

Current state: State1

在上述代码中,发起人类(Originator)负责创建和存储备忘录,备忘录类(Memento)用于存储当前状态,负责人类(Caretaker)则负责管理备忘录。在测试代码中,将发起人对象的状态从“State1”改变到“State2”,然后使用负责人对象的备忘录恢复机制将状态还原回原来的“State1”。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

高精度电压源如何设计出来的

高精度电压源是一种用于提供高精度电压的电子设备,通常用于测量和控制系统。高精度电压源的设计是一个复杂的过程,需要考虑多个因素,包括电路设计、元件选型、测量误差、稳定性等。下面将从电路设计和元件选型两个方面,详细介绍高…

如果通过Map转换成指定的class类

文章目录 前言如果通过Map转换成指定的class类1. 依赖2. 前期准备3. 测试 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话…

自然语言处理实战项目8- BERT模型的搭建,训练BERT实现实体抽取识别的任务

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目8- BERT模型的搭建,训练BERT实现实体抽取识别的任务。BERT模型是一种用于自然语言处理的深度学习模型,它可以通过训练来理解单词之间的上下文关系,从而为下游…

spring boot--web响应

2. 响应 前面我们学习过HTTL协议的交互方式:请求响应模式(有请求就有响应) 那么Controller程序呢,除了接收请求外,还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中,都已经设置了…

spring集成mybatis

目录 (1)新建javaEE web项目 ​(2)加入相关依赖的坐标 (3) 创建相应的包和类 (4) 配置spring和mybatis的配置文件 在resources中建mybatis-config.xml 在 resources中建spring.xml 在 resources中建db.xml 在 resources中建config.propertis 集成mybatis配置 ,导入myb…

MyBatis参数传递(提供ParamNameResolver类来进行参数封装)源码分析

MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式。 单个参数:实体类、Map集合、Collection、List、Array以及其他类型。 多个参数:Param注解定义的名称要与sql语句中参数占位符中的名称相同。 这里…

RDD缓存有哪些特点?

RDD之间进行相互迭代计算(Transformation的转换),当执行开启后,新RDD的生成,代表老RDD的消失。RDD的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见了。这个特性可以最大化的利用资源&#xff0…

【CSAPP】Binarybomb 实验(phase_1-6+secret_phase)

Binarybomb 实验(phase_1-6secret_phase) 实验内容 一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了7个阶段(phase1~phase6和一个隐藏阶段)。炸…

【CANoe示例分析】0002_SOMEIPDemo

该工程由Vector官方提供,作为仿真SOME/IP节点的示例。Demo中介绍了两种仿真SOME/IP节点的方法,一种是基于arxml数据库的仿真,另一种是没有数据库(arxml、fibex)的仿真。 无论是哪种形式的仿真,如果想要通过CAPL程序接收或者发送SOME/IP信息,都需要添加交互 层的信息,这…

不懂就问:年薪百万的程序员是怎么做到的?

很多人对程序员的第一反应就是“工资高”。 从行业平均薪酬来看,“程序员”相关专业的收入确实更高一点。 但是,“程序员”内部薪资却存在着很大的差异,多数人月薪在1-2万,一线城市可以达到3-5万,而顶级程序员&#…

探索Java面向对象编程的奇妙世界(六)

⭐ 多态(polymorphism)⭐ 对象的转型(casting)⭐ 抽象类⭐ 接口 interface ⭐ 多态(polymorphism) 多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人“吃…

回归方程的显著性检验——F检验

回归方程的显著性检验——F检验 9.2 回归方程的显著性检验 (edu-edu.com.cn) 概念 记号: y i y_i yi​:真实值,观测值 y ˉ \bar{y} yˉ​:真实值的平均值 y ^ \hat{y} y^​:估计值,预测值 几个差&#x…

Activiti、Flowable与CCFlow的选型对比

前言 工作流是什么,这个问题我们就不在此进行解释了,这里我们主要讲解一下Activiti、Flowable和CCFlow三款工作流的对比,为大家选型时做一些参考。 Activiti和Flowable大家可能多少都听说过,都是国外的工作流引擎,都…

Axure教程—单色面积图(中继器)

本文将教大家如何用AXURE制作单色面积图 一、效果介绍 如图: 预览地址:https://icg26y.axshare.com/ 下载地址:https://download.csdn.net/download/weixin_43516258/87837919?spm1001.2014.3001.5503 二、功能介绍 简单填写中继器内容即…

软件设计师总结-含括学习方法和学习过程,可参考

目录 考前备战宏观    心路历程-感受    学习阶段-计划的安排 微观一、课本和视频的学习    本阶段的目的:    侧重点    涉及的学习方法(最后有如何使用这些方法)    学习结果 二、32小时通关辅助前面的知识点    本阶段的…

提升企业管理效率的利器——ADManager Plus

在当今信息时代,企业的规模和复杂性不断增长,管理各个方面变得愈发具有挑战性。而在企业管理中,活跃目录(Active Directory)起着至关重要的作用。它是一种用于组织内部的用户、计算机、组和其他对象进行集中管理的目录…

javascript中的this与函数讲解

前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域。并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码,都存放在Window函数内&#x…

Hack The Box-Redeemer关卡

TASK 1 任务 1 Which TCP port is open on the machine? 计算机上打开了哪个 TCP 端口? 6379TASK 2 任务 2 Which service is running on the port that is open on the machine? 计算机上打开的端口上运行哪个服务? redisTASK 3 任务 3 What typ…

java学习——java学习进度一String类1(学习记录——供回溯)

String 分割字符串 split( ) String s "1,2,3,4"; //未使用split分割前 System.out.println(s.length());//使用split分割后 String[] ssplit s.split(","); System.out.println(ssplit.length);split( , ) //两个参数都有的时候,第一个为用…

视频编辑软件:迅捷视频工具箱

这是一款功能强大、易于使用的视频编辑工具,支持视频剪辑、视频转换、音频转换、视频压缩、视频水印、字幕贴图等实用功能,可以帮助你制作出高质量的视频作品。(传送门:https://www.xunjiepdf.com/xjspgjx) 功能简介 …