备忘录模式(行为型)

目录

一、前言

二、备忘录模式

三、总结


一、前言

        备忘录模式(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.mfbz.cn/a/586308.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

Notes for the missing semester. Useful and basic knowledge about Linux.

The Shell Contents The first course is to introduce some simple commands. I’ll list some commands that I’m not familiar with: # --silent means dont give log info, # --head means we only want the http head. curl --head --silent bing.com.cn# cut --deli…

(7)快速调优

文章目录 前言 1 安装脚本 2 运行 QuikTune 3 高级配置 前言 VTOL QuikTune Lua 脚本简化了为多旋翼飞行器的姿态控制参数寻找最佳调整的过程。 脚本会缓慢增加相关增益,直到检测到振荡。然后,它将增益降低 60%,并进入下一个增益。所有增…

smac 路径优化器分析——距离成本和代价地图成本分析

参考 泰勒级数直观详解 前向差分,后向差分,中心差分 相关文章 smac 路径优化器分析——平滑度成本分析 smac 路径优化器分析——曲率成本分析 距离成本 距离成本函数 用优化后的点与原路径点的欧氏距离的平方作为成本。 下图中蓝色原点是原路径点…

java-springmvc 01 补充 javaweb 三大组件Servlet,Filter、Listener(源码都是tomcat8.5项目中的)

01.JavaWeb三大组件指的是:Servlet、Filter、Listener,三者提供不同的功能 这三个在springmvc 运用很多 Servlet 01.Servlet接口: public interface Servlet {/*** 初始化方法* 实例化servlet之后,该方法仅调用一次 * init方法必须执行完…

【MySQL | 第九篇】重新认识MySQL锁

文章目录 9.重新认识MySQL锁9.1MySQL锁概述9.2锁分类9.2.1锁的粒度9.2.2锁的区间9.2.3锁的性能9.2.4锁的级别 9.3拓展:意向锁9.3.1意向锁概述9.3.2意向锁分类9.3.3意向锁作用(1)意向锁的兼容互斥性(2)例子1&#xff08…

C++ | Leetcode C++题解之第61题旋转链表

题目: 题解: class Solution { public:ListNode* rotateRight(ListNode* head, int k) {if (k 0 || head nullptr || head->next nullptr) {return head;}int n 1;ListNode* iter head;while (iter->next ! nullptr) {iter iter->next;n…

CTFHub-Web-SQL注入

CTFHub-SQL注入-WP 1.整数型注入 1.题目说输入1,先将1输入查看结果 2.接着输入4-1,发现输出的结果为4-1,判定存在整数型注入 3.查询字段数,出现了回显,判断这里的字段数为2 1 order by 24.判断注入点在2的位置&…

imx6ull启动方式和镜像文件烧写

文章目录 前言一、BOOT启动方式1.串行下载2.内部BOOT模式 二、内部BOOT模式详细流程1.启动设备的选择2.镜像烧写 总结 前言 💦 I.MX6Ull 支持多种启动方式以及启动设备,比如可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。用户可以根据实际情况&#x…

【docker】Docker开启远程访问

将构建的镜像自动上传到服务器。 需要开放 Docker 的端口,让我们在本地能连接上服务器的 Docker,这样,才能上传构建的镜像给 Docker。 开启远程访问 首先在服务器打开 Docker 的服务文件 vim /usr/lib/systemd/system/docker.service修改…

刷题《面试经典150题》(第九天)

加油! 学习目标:学习内容:学习时间:知识点学习内容:跳跃游戏 II - 力扣(LeetCode)H 指数 - 力扣(LeetCode)盛最多水的容器 - 力扣(LeetCode)矩阵置…

OpenHarmony 实战开发——智能指针管理动态分配内存对象

概述 智能指针是行为类似指针的类,在模拟指针功能的同时提供增强特性,如针对具有动态分配内存对象的自动内存管理等。 自动内存管理主要是指对超出生命周期的对象正确并自动地释放其内存空间,以避免出现内存泄漏等相关内存问题。智能指针对…

docker学习笔记4:CentOS7安装docker

文章目录 一、安装docker二、配置阿里云加速三、测试镜像安装本篇博客介绍如何在centos7里安装docker,关于CentOS7的安装可以查看本专栏的这篇博客: VmWare CentOS7安装与静态ip配置 centos7里安装docker步骤如下: 一、安装docker 先在终端输入su进入root用户,输入如下命…

linux 服务器利用阿里网盘API实现文件的上传和下载

文章目录 背景脚本初始化 阿里云盘API工具 aligo安装aligoaligo教程实战parse.py 演示上传文件上传文件夹下载文件下载文件夹 背景 最近在用ubuntu系统做实验,而ubuntu 系统的文件上传和下载操作很麻烦; 于是便打算使用阿里网盘的API 进行文件下载与上传…

ChatGPT 网络安全秘籍(四)

原文:zh.annas-archive.org/md5/6b2705e0d6d24d8c113752f67b42d7d8 译者:飞龙 协议:CC BY-NC-SA 4.0 第八章:事故响应 事故响应是任何网络安全策略的关键组成部分,涉及确定、分析和缓解安全漏洞或攻击。 及时和有效地…

推荐一个wordpress免费模板下载

首页大背景图,首屏2张轮播图,轮换展示,效果非常的炫酷,非常的哇噻,使用这个主题搭建的wordpress网站,超过了200个,虽然是一个老主题了,不过是经得起时间考验的,现在用起来…

IDEA 中 git fetch 验证报错 The provided password or token is incorrect

参考链接: 【GitLab】-HTTP Basic: Access denied.remote:You must use a personal access token_http basic: access denied. the provided password o-CSDN博客 idea使用gitLab报错:remote: HTTP Basic: Access denied_idea remote: http basic: acc…

C++编译器的程序转化

编译器在某些情况下会对程序进行转化,有些是编译器需要的,有些是出于性能考虑的,转化可能会产生出乎意料的结果 文章目录 明确的初始化操作参数的初始化返回值的初始化在使用者层面做优化在编译器层面做优化NRV 优化NRV优化的弊端 明确的初始…

在AndroidStudio创建Flutter项目并运行到模拟器

1.Flutter简介 Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费,拥有宽松的开源协议,适合商…

基于模糊PI控制算法的龙格库塔CSTR模型控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于模糊PI控制算法的龙格库塔CSTR模型控制系统simulink建模与仿真。基于模糊PI控制算法的龙格-库塔(Runge-Kutta, RK)连续搅拌釜反应器(Co…
最新文章