设计模式22——备忘录模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

备忘录模式(Memento)

对象行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:


一、概述

1、在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

1.1、直观的理解

就相当于给正在运行的对象拍了一个快照,只不过这个快照是这个对象它自己弄得。

1.2、主要角色:

  • 备忘录:保存原发器的内部信息,也就是上图的快照
  • 原发器:目标对象,也就是上图的对象A
  • 管理者:管理备忘录

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 必须保存一个对象在某个时刻的(部分)状态,这样以后需要时他才能恢复到先前的状态
  • 如果一个接口让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。我们自己定义一个管理者,让别人只能通过管理者对这些状态进行操作,那么就在一定程度上避免暴露了。

二、简单举例

现在要把一个对象的内部状态从字符串A改变到字符串B,然后再还原。这个例子比较简单,就不再详细分析了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:

原发器类:

public class Originator {
    private String state;//举例是String类型,实际开发中需要灵活应变,目标对象里有什么信息需要保存,把它们都加进去

    public String getState() {
        return state;
    }

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

    public void show() {
        System.out.println("State:" + this.state);
    }

    public Memento createMemento() {
        return new Memento(this.state);
    }

    public void recoveryMemento(Memento memento) {
        this.setState(memento.getState());
    }
}

备忘录类:

public class Memento {
    private String state;//保存目标对象的内部信息

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

    public String getState() {
        return state;
    }

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

管理者类:

public class Caretaker {
    private Memento memento;//也可以是备忘录实例对象的集合,等等都可以,需要结合实际问题灵活运用

    public Memento getMemento() {
        return memento;
    }

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

主程序(发起请求的类):

public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setState("A");
        originator.show();

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

        originator.setState("B");
        originator.show();

        originator.recoveryMemento(caretaker.getMemento());
        originator.show();
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

LeetCode739:每日温度

题目描述 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 解题思想 使用单…

17-java网络编程

目录 第17章 网络编程 17.1 软件结构 17.2 网络通信三要素 17.2.1 IP地址和域名 1、IP地址 2、域名 17.2.2 端口号 17.2.3 网络通信协议 17.3 TCP与UDP协议 17.3.1 UDP协议 17.3.2 TCP协议 1、三次握手 2、四次挥手 17.4 网络编程API 17.4.1 InetAddress类 17.4…

B端UI设计,演绎高情逸态之妙

B端UI设计,演绎高情逸态之妙

达梦数据库(五) -------- 达梦数据库+mybatisPlus+springboot

前言:安装完达梦数据库后,需要初始化实例,在初始化实例时,需要注意大小写敏感的设置。大小写敏感只能在初始化数据库的时候设置,默认为大小写敏感,一旦设置成功就无法修改,如果想要修改&#xf…

DBeaver连接Elasticsearch

一、下载DBeaver 二、连接: 1、一定要选择开源的 Open Distro Elasticsearch 2、填写地址: 3、选择“URL”,将https改为http 否则会报SSL错误 4、测试连接

如何免费查到企业的公开信息?

很多小伙伴在查询企业信息的时候,都想要一个综合的平台能够查到企业多维度的信息。 然而企业的信息虽然是公开的,但是信息都分布在不同的网站上,比如企业公示系统,裁判文书网,知识产权网等。 一个企业就要用到多个网…

php反序列化学习(2)

1、魔术方法触发规则: 魔术方法触发的前提是:魔法方法所在类(或对象)被调用 分析代码,_wakeup()的触发条件是进行反序列化,_tostrinng()触发的条件是把对象当成字符串调用,但是魔术方法触发的前…

yolov10训练

yolov10训练 1 yolov10 COCO训练1.1 环境配置1.2 模型训练 2 yolov10 训练自己的数据集2.1 使用源码训练2.1.1 数据集的准备2.1.2 yolov10的预训练权重2.1.3 模型训练2.1.3.1 YOLO2.1.3.2 YOLOv10 2.1.4 模型验证 3 参考链接 论文代码:https://github.com/THU-MIG/y…

dnsrecon一键开始多线程DNS信息查询(KALI工具系列十三)

目录 1、KALI LINUX简介 2、dnsrecon工具简介 3、在KALI中使用dnsnum 3.1 子域名查找 3.2 扫描其是否有DNS服务 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版,广泛用于网络安全社区。它具有全面的预安装工具和功能集&#…

Go微服务: 基于Docker搭建Kong网关环境

概述 在当今的微服务架构中,API网关扮演着至关重要的角色,它作为系统的统一入口负责处理所有内外部请求,实现路由转发、负载均衡、安全控制、限流熔断等多种功能Kong,作为一个开源、高性能、可扩展的API网关,凭借其强…

msf攻击windows实例

环境:攻击机kali(192.168.129.139),目标机windows10(192.168.129.132) 方法一:通过web站点,使用无文件的方式攻击利用执行(命令执行漏洞) 方法二&#xff1…

音视频开发—视频相关概念:YUV与RGB

文章目录 YUV相关概念组成部分优点常见的 YUV 格式数据量的计算YUV4:2:0 存储格式平面模式(planar):打包模式(packed) RGB 和 YUV 的定义关系与转换RGB 到 YUV 的转换YUV 到 RGB 的转换 使用场景优缺点 YUV相关概念 YUV 是一种颜色编码格式&…

MySQL统计字符长度:CHAR_LENGTH(str)

对于SQL表,用于计算字符串中字符数的最佳函数是 CHAR_LENGTH(str),它返回字符串 str 的长度。 另一个常用的函数 LENGTH(str) 在这个问题中也适用,因为列 content 只包含英文字符,没有特殊字符。否则,LENGTH() 可能会返…

调用上传文件接口出现格式错误

一、造成这种错误的可能有很多 1.检查一下传递格式 2.检查一下接口要求的格式 二、举个例子 这两个有什么区别? 那就是json、和form-data,一定要看仔细接口 如果还是按照json的方式去传就会报错 三、更改header里Content-Type的类型 json等的heade…

【C++】C++入门2.0

各位读者老爷好,本鼠最近浅学了一点C的入门知识!利用本博客作为笔记的同时也希望得到各位大佬的垂阅! 目录 1. 引用 1.1.引用的概念 1.2.引用的特性 1.3.引用的使用场景 1.4.引用的易错点 1.5.引用的优势 1.6.引用和指针 2.内联函数 …

精雕细琢,B 端 UI 设计展典雅风范

精雕细琢,B 端 UI 设计展典雅风范

面试题:计算机网络中的七四五是什么?

面试题:计算机网络中的七四五是什么? 计算机网络中说的七四五是指:OSI 七层模型、TCP/IP 四层模型、OSI 与 TCP/IP 的综合五层模型 OSI 七层模型 OSI 将计算机网络分为了七层,每一层抽象底层的内容,并遵守一定的规则…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --2)nginx配置

hello大家今天教大家如何用nginx实验tomcat的负载均衡,同理其他的也可以,如httpd等 首先需要准备一个nginx和tomcat包,这里用到的是版本号为 然后需要准备最少三台linux虚拟机,然后我们开始吧 1.安装tomcat 解包 tar zxf /mnt/…

数据结构(三)循环链表 约瑟夫环

文章目录 一、循环链表(一)概念(二)示意图(三)操作1. 创建循环链表(1)函数声明(2)注意点(3)代码实现 2. 插入(头插&#x…

uni-app+php 生成微信二维码 分销海报

主要代码如下,可直接复制调试参数: //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…