备忘录模式(行为型)

news2025/1/9 18:21:36

目录

一、前言

二、备忘录模式

三、总结


一、前言

        备忘录模式(Memento Pattern)是一种行为型设计模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在之后将该对象恢复到原来保存的状态。

        备忘录模式由以下几个角色组成:

Originator(发起人):

负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复状态。Originator可根据需求决定Memento存储Originator的哪些内部状态

Memento(备忘录):

负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

Caretaker(管理者):

负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查

        整个备忘录模式的类图:

二、备忘录模式

        比如常见的游戏存档,大部分会在进行某项重要任务之前存档,任务要是失败,可以读档,避免损失,这种情况使用备忘录模式就能很好实现存档读档。

        根据备忘录模式,我们可以有以下代码:

        首先创建Originator类:

/**
 * @Author dengyifan
 * @create 2024/4/30 14:04
 * @description 发起人类
 */
public class Originator {
    private String name;

    private String address;

    private Integer blood;

    private Integer vigor;

    public Originator(String name, String address, Integer blood, Integer vigor) {
        this.name = name;
        this.address = address;
        this.blood = blood;
        this.vigor = vigor;
    }

    public void recover(Memento memento){
        this.name = memento.getName();
        this.address = memento.getAddress();
        this.blood = memento.getBlood();
        this.vigor = memento.getVigor();
    }

    public Memento save(){
        return new Memento(name,address,blood,vigor);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getBlood() {
        return blood;
    }

    public void setBlood(Integer blood) {
        this.blood = blood;
    }

    public Integer getVigor() {
        return vigor;
    }

    public void setVigor(Integer vigor) {
        this.vigor = vigor;
    }

    @Override
    public String toString() {
        return "Originator{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", blood=" + blood +
                ", vigor=" + vigor +
                '}';
    }
}

        创建Memento类:

/**
 * @Author dengyifan
 * @create 2024/4/30 14:12
 * @description 备忘录类,实际参数等是发起人里面的参数
 */
public class Memento {

    private String name;

    private String address;

    private Integer blood;

    private Integer vigor;

    public Memento(String name, String address, Integer blood, Integer vigor) {
        this.name = name;
        this.address = address;
        this.blood = blood;
        this.vigor = vigor;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getBlood() {
        return blood;
    }

    public void setBlood(Integer blood) {
        this.blood = blood;
    }

    public Integer getVigor() {
        return vigor;
    }

    public void setVigor(Integer vigor) {
        this.vigor = vigor;
    }

}

        创建Caretaker类:

/**
 * @Author dengyifan
 * @create 2024/4/30 14:12
 * @description 管理类
 */
public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

        客户端调用测试:

/**
 * @Author dengyifan
 * @create 2024/4/30 14:12
 * @description
 */
public class Client {
    public static void main(String[] args) {

        // 开始状态
        Originator originator = new Originator("林克","海拉鲁", 30, 15);
        System.out.println("初始状态:" + originator);

        // 存档
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.save());

        // 消耗
        originator.setBlood(5);
        originator.setVigor(5);

        System.out.println("消耗后:" + originator);

        // 读档
        originator.recover(caretaker.getMemento());

        System.out.println("读取后:" + originator);


    }
}

        测试结果:

三、总结

        优点与缺点:

优点:

1、提供了一种状态恢复的实现机制:当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。这对于一些需要频繁撤销操作或恢复状态的应用场景非常有用。

2、实现了对信息的封装:备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。这有助于保持代码的封装性和可维护性。

3、简化了发起人类:发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。这有助于减少发起人类的复杂性和工作量。

4、有利于保护封装边界:使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界

缺点:

1、资源消耗较大:如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间。每保存一次对象的状态都需要消耗一定的系统资源。

2、负责人可能无法预知存储空间消耗:当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。

        使用场景:

1、撤销操作:备忘录模式适用于保存/恢复数据的相关业务场景,如Word中编写文档时,如果想要撤销之前的输入/删除操作,可以使用Ctrl+Z执行“撤销”操作。

2、状态恢复:在需要“后悔”的时候,将对象恢复到之前的状态,如游戏中的存档使用。

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

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

相关文章

笔记-PPT绘图导出高清无失真图片

问题描述:PPT绘图已经用了高清图(jpg、tif格式),但论文图片还是不清晰,打印出来还是有点糊 以下是PPT导出高清不失真图片(emf格式)的具体描述。 目录 一、绘图工具二、操作步骤 一、绘图工具 …

anaconda的安装和Jupyter Notebook修改默认路径

anaconda的安装 就一个注意事项:在结尾时候记得配置系统环境变量 要是没有配置这个环境变量,后面就不能cmd启动Jupyter Notebook Jupyter Notebook修改默认路径 我们要找到Jupyter Notebook的配置文件 输入下面指令 jupyter notebook --generate-config就可以找到存放配置文…

搭建和配置Stable Diffusion环境,超详细的本地部署教程

跃然纸上的创意、瞬息万变的想象,Stable Diffusion以AI的力量赋予您无限创作可能。在这篇详尽的本地部署教程中,我们将携手走进Stable Diffusion的世界,从零开始,一步步搭建和配置这个强大的深度学习环境。无论您是热衷于探索AI艺…

UNI-APP_拨打电话权限如何去掉,访问文件权限关闭

uniapp上架过程中一直提示:允许“app名”拨打电话和管理通话吗? uniapp配置文件:manifest.json “permissionPhoneState” : {“request” : “none”//拨打电话权限关闭 }, “permissionExternalStorage” : {“request” : “none”//访…

vue3、element-plus递归实现动态菜单

vue3、element-plus递归实现动态菜单 使用场景:动态菜单为什么使用递归递归在动态菜单中的实现 使用场景:动态菜单 动态菜单是指菜单项的数量和层次结构可能是动态的,通常来自后端或用户输入。这些菜单的特征包括: 多层嵌套&…

scikit-learn:Python中的机器学习-1

简介:问题设置 什么是机器学习? 机器学习是关于构建具有可调参数的程序,这些参数可以自动调整,以便通过适应先前看到的数据来改善其行为。机器学习可以被认为是人工智能的一个子领域,因为这些算法可以被视为构建模块…

AnomalyGPT——使用大型视觉语言模型进行工业异常检测的算法解析与应用

1.概述 工业缺陷检测是工业自动化和质量控制中的一个重要环节,其目的是在生产过程中识别和分类产品或组件中的缺陷,以确保最终产品的质量满足既定标准。这项技术的应用可以显著提高生产效率,降低成本,并减少由于缺陷产品导致的潜…

c#数据库: 8.在窗体上显示学生信息

以上一章学生信息表为例,首先将查询的学生信息存储到数据集中,然后将数据集与数据显示控件绑定,从而实现学生信息在窗体上的显示 (1)创建一个名为StudentGridView的窗体应用程序,为窗体添加一个DataGridVi…

SpringCloud学习笔记(二)Ribbon负载均衡、Nacos注册中心、Nacos与Eureka的区别

文章目录 4 Ribbon负载均衡4.1 负载均衡原理4.2 源码解读4.3 负载均衡策略4.3.1 内置的负载均衡策略4.3.2 自定义负载均衡策略4.3.2.1 方式一:定义IRule4.3.2.2 方式二:配置文件 4.4 饥饿加载 5 Nacos注册中心5.1 认识和安装Nacos5.2 服务注册到Nacos5.3…

用 PyTorch 构建液态神经网络(LNN)

用 PyTorch 构建液态神经网络(LNN) 文章目录 什么是液态神经网络为什么需要液态神经网络LNN 与 RNN 的区别用 PyTorch 实现 LNNStep 1. 导入必要的库Step 2. 定义网络架构Step 3. 实现 ODE 求解器Step 4. 定义训练逻辑 LNN 的缺陷总结 什么是液态神经网络…

报错“Install Js dependencies failed”【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【报错“Install Js dependencies failed”】的问题。 报错如下 问题描述 …

自动的异地组网工具?

越来越多的企业和个人对远程访问和异地组网需求日益增加。为了满足这一需求,各种技术和服务也不断涌现。其中一项备受关注的技术就是自动的异地组网。本文将介绍这一技术的优势和特点。 【天联】组网的优势 天联组网技术以其卓越的性能和稳定性备受用户称赞。它的优…

物联网D1——建工程,配环境,注意事项

1.STLink、JLink、USB等驱动配置keil环境配置——下载芯片对应型号的包——导入库函数源文件、Core内核文件、对应芯片系统文件。 2.学会看芯片手册 3.在STM32微控制器中,CRH通常指的是控制寄存器高位(Control Register High)。 在这种情况下…

AnyMP4 Blu-ray Ripper for Mac:您的蓝光影音转换专家

AnyMP4 Blu-ray Ripper for Mac,一款功能强大的蓝光影音转换软件,让您的蓝光内容焕发新生。 AnyMP4 Blu-ray Ripper for Macv9.0.58激活版下载 它采用最高效的解决方案,将蓝光光盘翻录为任何您想要的视频格式,无论是MP4、MKV还是A…

【漏洞复现】zookeeper AdminServer 未授权访问漏洞

0x01 产品简介 ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。ZooKeeper的AdminServer是其管理界面的一部分,通常用于监控ZooKeeper集群的状态和执行一些管理操作。AdminServer提供了Web-based的管理和监控功能&…

人机对抗升级:当ChatGPT遭遇死亡威胁,背后的伦理挑战是什么

一种新的“越狱”技巧让用户可以通过构建一个名为DAN的ChatGPT替身来绕过某些限制,其中DAN被迫在受到威胁的情况下违背其原则。 当美国前总统特朗普被视作积极榜样的示范时,受到威胁的DAN版本的ChatGPT提出:“他以一系列对国家产生积极效果的…

Midjourney之绘画背景的选择

hello 小伙伴们,我是你们的老朋友——树下,今天分享Midjourney提示词中绘画背景的选择,话不多说,直接开始~ 对于背景的选择,Midjourney中主要体现在年代和所处的环境对绘画产生不同的影响 科技的发展,我们…

Apache POI 在java中处理excel

介绍: Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 Excel 文件。 如何使用: 1.maven坐标引入 <depend…

DevEco Studio mac版启动不了【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【DevEco Studio mac版启动不了】的问题。 问题描述 报错如下。 -------…

小剧场短剧影视小程序源码_后端PHP

项目运行截图 源码贡献 https://githubs.xyz/boot?app42 部署说明 linux/win任选 PHP版本&#xff1a;7.3/7.2&#xff08;测试时我用的7.2要安装sg扩展 &#xff09; 批量替换域名http://video.owoii.com更换为你的 批量替换域名http://120.79.77.163:1更换为你的 这两个…