设计模式:备忘录模式

目录

  • 组件
  • 代码示例
  • 源码中使用
  • 优缺点
  • 总结

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获和恢复对象的内部状态。备忘录模式可以将对象的状态保存到备忘录对象中,并在需要时从备忘录对象中恢复状态,实现对象状态的保存和回滚。

组件

在备忘录模式中,通常包含以下角色:

  1. 发起人(Originator):负责创建备忘录对象,并将自身的状态保存到备忘录对象中。
  2. 备忘录(Memento):用于存储发起人对象的状态。备忘录可以记录发起人的状态,也可以根据需要进行状态的恢复。
  3. 管理者(Caretaker):负责保存备忘录对象,并提供对备忘录的访问。管理者可以保存多个备忘录对象,实现多个时间点的状态回滚。

代码示例

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();}
}// 备忘录类
class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// 管理者类
class Caretaker {private Memento memento;public void saveMemento(Memento memento) {this.memento = memento;}public Memento retrieveMemento() {return memento;}
}// 客户端代码
public class Main {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State 1");System.out.println("当前状态:" + originator.getState());// 保存状态caretaker.saveMemento(originator.saveStateToMemento());originator.setState("State 2");System.out.println("当前状态:" + originator.getState());// 恢复状态originator.restoreStateFromMemento(caretaker.retrieveMemento());System.out.println("恢复后的状态:" + originator.getState());}
}

在上述示例中,我们定义了发起人类(Originator)、备忘录类(Memento)和管理者类(Caretaker)。发起人类负责创建备忘录对象并保存状态,备忘录类用于存储状态,管理者类负责保存和提供对备忘录对象的访问。
在客户端代码中,我们创建了发起人对象和管理者对象。发起人对象设置了初始状态,并通过保存状态到备忘录对象中来保存状态。然后,我们修改发起人对象的状态,并通过从备忘录对象中恢复状态来回滚到之前的状态。
这个示例展示了如何使用Java实现备忘录模式,通过备忘录对象保存和恢复发起人对象的状态,实现对象状态的保存和回滚

源码中使用

备忘录模式在源码中有很多应用。以下是一些常见的源码中使用备忘录模式的情况:

  1. Java中的java.util.Date类:Date类提供了 getTime() 和 setTime() 方法来获取和设置日期的时间戳,可以用于保存和恢复日期对象的状态。
  2. Android开发中的Activity生命周期:在Android中,Activity的生命周期方法(如 onCreate() 、 onPause() 等)被用作保存和恢复Activity的状态,以便在系统需要时重新创建和恢复Activity。
  3. 数据库事务管理:在数据库中,事务管理器使用备忘录模式来保存数据库的状态,并在需要时回滚事务,以确保数据的一致性和完整性。
  4. 文本编辑器中的撤销/重做功能:文本编辑器中的撤销/重做功能使用备忘录模式来保存编辑操作的历史状态,以便用户可以撤销和重做操作。
    这些是备忘录模式在源码中的一些常见应用。备忘录模式通过备忘录对象来保存和恢复对象的状态,提供了一种可靠的方式来管理状态,并支持撤销和重做等操作。

优缺点

优点:

  1. 备忘录模式可以实现对象状态的备份和恢复,使得系统可以方便地回滚到之前的状态。
  2. 备忘录模式将状态保存在备忘录对象中,与原对象解耦,避免了状态暴露给其他对象,保护了对象的封装性。
  3. 备忘录模式可以灵活地扩展和修改备忘录对象,以满足不同的需求。
    缺点:
  4. 备忘录模式可能会消耗大量的内存,特别是在需要保存大量状态的情况下。
  5. 如果频繁备份和恢复对象状态,会对系统的性能产生一定的影响。
  6. 当对象的状态较多时,管理备忘录对象的成本可能会增加。

总结

备忘录模式通过备份和恢复对象状态,提供了一种可靠的方式来管理对象状态。它可以保护对象的封装性,并提供灵活的状态恢复机制。然而,备忘录模式可能会消耗较多的内存,并对系统性能产生一定的影响。在使用备忘录模式时,需要权衡其优缺点,并根据具体情况进行选择。

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

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

相关文章

电脑计算机xinput1_3.dll丢失的解决方法分享,四种修复手段解决问题

日常生活中可能会遇到的问题——xinput1_3.dll丢失的解决方法。我相信,在座的很多朋友都曾遇到过这个问题,那么接下来,我将分享如何解决这个问题的解决方法。 首先,让我们来了解一下xinput1_3.dll文件。xinput1_3.dll是一个动态链…

第1篇 目标检测概述 —(1)目标检测基础知识

前言:Hello大家好,我是小哥谈。目标检测是计算机视觉领域中的一项任务,旨在自动识别和定位图像或视频中的特定目标,目标可以是人、车辆、动物、物体等。目标检测的目标是从输入图像中确定目标的位置,并使用边界框将其标…

Go基础语法:map

9 map Go 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。 Go 语言中的 map 是引用类型,必须初始化之后才能使用。 9.1 map 定义 Go 语言中 map 的定义语法为&…

sql on条件判断是要注意null值

我是因为用了merge into语法,然后on条件中判断的字段是可配置的,这就导致了,有时候判断条件多的情况下,判断的字段会碰到有null值的情况,如果on两边的字段都是null,null和null对比就会导致结果为false&…

安全防御第二次作业

1. 防火墙支持那些NAT技术,主要应用场景是什么? 防火墙支持几乎所有的NAT技术,包括源NAT、目标NAT、双向NAT等,主要应用场景是保护内部网络免受外部网络的攻击 NAT技术可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff…

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇 🌿相关项目介绍《基于stc8H驱动三相无刷电机开源项目技术专题概要》 🔨停机状态,才能进入设置状态,可以设置调速模式,以及转动方向。 ✨所有的功能基本已经完成调试,目前所想到的功能基本已经都添加和实现。引脚利…

C++入门知识

Hello,今天我们分享一些关于C入门的知识,看完至少让你为后面的类和对象有一定的基础,所以在讲类和对象的时候,我们需要来了解一些关于C入门的知识。 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对…

【Python从入门到进阶】37、selenium关于phantomjs的基本使用

接上篇《36、Selenium 动作交互》 上一篇我们介绍了selenium操作网页的动作内容。本篇我们来学习有关phantomjs的相关知识。 一、selenium的缺点 在介绍PhantomJS之前,让我们先讨论一下直接使用Selenium的一些缺点。 1、显示浏览器窗口:Selenium通常需…

AndroidUtil - 强大易用的安卓工具类库

官网 https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md 项目介绍 AndroidUtilCode 🔥 是一个强大易用的安卓工具类库,它合理地封装了安卓开发中常用的函数,具有完善的 Demo 和单元测试,利用其封装好的 API…

CUDA学习笔记0924

一、nvprof分析线程束和内存读写 (1)线程束占用率分析 线程束占用率:nvprof --metrics achieved_occupancy (2)内存读写分析 内核数据读取效率:nvprof --metrics gld_throughput 程序对设备内存带宽利…

《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.4.1 Inception块 GoogLNet 中的基本卷积块叫做 Inception 块(大概率得名于盗梦空间),由 4 条并行路径组成。 前 3 条路径使用窗口…

合规性管理如何帮助产品团队按时交付?

成功的产品和产品发布背后通常需要经过一个涉及多个监督机构、多功能团队和利益相关者的复杂流程。在组织的治理、风险管理和合规性(GRC)框架下,产品团队不仅需要追求市场创新,还需要确保符合所有适用的法规、标准和合同要求。由于…

libpcap之socket创建

一、 lipcap回调注册 在libpcap中,最重要的就是打开接口,其中关键函数为pcap_activate。这里只关注Linux平台。 只分析通用平台。 pcap_t * pcap_create(const char *device, char *errbuf) { ... p pcap_create_interface(device_str, errbuf); ... …

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中,为了真实模拟多个用户同时进行操作以度量服务器的处理能力,可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意:虽然通过加入集合点可…

Go内置函数make和new的区别?

首先纠正一下make 和 new 是内置函数,不是关键字。 变量初始化,一般分为2步,变量声明变量内存分配,var 关键字就是用来声明变量的,new和make 函数主要是用来分配内存的。 var 声明值类型的变量时,系统会默…

利用Socks5代理IP加强跨界电商爬虫的网络安全

随着跨界电商的兴起,爬虫技术在这个领域变得越来越重要。然而,网络安全一直是一个值得关注的问题。在本文中,我们将讨论如何利用代理IP和Socks5代理来增强跨界电商爬虫的网络安全,确保稳定和可靠的数据采集,同时避免封…

Leetcode13. 罗马数字转整数

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 5…

Vector Art - 矢量艺术

什么是矢量艺术? 矢量图形允许创意人员构建高质量的艺术作品,具有干净的线条和形状,可以缩放到任何大小。探索这种文件格式如何为各种规模的项目提供创造性的机会。 什么是矢量艺术作品? 矢量艺术是由矢量图形组成的艺术。这些图形是基于…

后端面试关键问题大总结

一、Java基础 1.HashMap的底层原理 2.说一下List的特点 3.介绍一下Java的基本数据类型 (问到这个问题说明你触碰到面试官的技术能力水平底线了) 二、线程 1.说一下线程的4种创建方式 2.线程池的两种创建方式,包括jdk方式和spring方式 …

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 第二题 题目来源 题目内容 解决方法 方法一:模拟 方法二:数学规律 方法三:分组 第三题 题目来源 题目内容 解决方法 方法一:数学方法 方法…