目录

1. 概念

1.1、定义

1.2、适用场景

2、角色划分

3、实现

1、Originator(发起人)

2、Memento(备忘录)

3、Caretaker(管理者)

4、使用示例

4、优缺点

4.1、优点

4.2、缺点


前言

        备忘录模式是一种行为型设计模式,用于在不破坏封装性的情况下保存和恢复对象的状态。它包含源发器、备忘录管理者三个角色。

        该模式常用于撤销操作,如文本编辑器的撤销功能和数据库事务管理。

        备忘录模式虽然有内存占用和性能开销的缺点,但在需要状态管理的场景中十分有用。

设计模式分类如下:


1. 概念

1.1、定义

        备忘录模式(Memento Pattern))用于在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在需要时恢复这个状态(如撤销操作)。

        即允许对象把当前状态保存到外部对象中。以后可将其恢复。

1.2、适用场景

1、需要保存和恢复数据场景(如撤销、历史快照、存档、游戏进度、表单编辑器等)。

2、不希望外部对象随意访问对象内部细节,但需要保存和恢复快照。


2、角色划分

如下图所示:

  • Originator(发起人/原发器):拥有内部状态,需要保存和恢复
  • Memento(备忘录):保存Originator的状态
  • Caretaker(管理者/看护者):保存并管理备忘录,但不能操作备忘录内部实现内容


3、实现

1、Originator(发起人)

class Editor {private String text;public void setText(String text) { this.text = text; }public String getText() { return text; }public Memento save() { return new Memento(text); }public void restore(Memento m) { this.text = m.getText(); }
}

2、Memento(备忘录)

class Memento {private final String text;public Memento(String text) { this.text = text; }public String getText() { return text; }
}

3、Caretaker(管理者)

import java.util.Stack;
class Caretaker {private Stack<Memento> history = new Stack<>();public void add(Memento m) { history.push(m); }public Memento undo() {if (!history.isEmpty()) return history.pop();return null;}
}

4、使用示例

public class Main {public static void main(String[] args) {Editor editor = new Editor();Caretaker caretaker = new Caretaker();editor.setText("第一版");caretaker.add(editor.save());editor.setText("第二版");caretaker.add(editor.save());editor.setText("第三版");// 撤销到第二版editor.restore(caretaker.undo());System.out.println(editor.getText()); // 输出 第二版// 再撤销editor.restore(caretaker.undo());System.out.println(editor.getText()); // 输出 第一版}
}

4、优缺点

4.1、优点

1、状态保存与恢复:

        备忘录模式可以帮助我们保存对象的状态,并在需要时恢复到之前的状态。这在某些情况下非常有用,比如撤销操作或者程序崩溃后的恢复。

2、封装性和隔离性:

        可以确保对象的状态保存在备忘录对象中,而不会暴露给其他对象。这为对象的封装性和隔离性提供了保护,使得对象的状态变化对其他对象是透明的。


4.2、缺点

1、内存占用:

        可能引起较大的内存占用,特别是当对象的状态较多且状态改变频繁时。每个备忘录对象都需要保存一份完整的状态,如果状态较多或者备忘录对象较多,可能会消耗大量内存。

2、性能开销:

        备忘录模式涉及到创建、存储和恢复状态的操作,这些操作可能引起一定的性能开销。特别是在状态较大或者对象较复杂的情况下,备忘录模式的性能可能会受到影响。


总结:


参考文章:

1、设计模式(十九)行为型:备忘录模式详解-CSDN博客文章浏览阅读443次,点赞19次,收藏21次。备忘录模式(Memento Pattern)是 GoF 23 种设计模式中的行为型模式之一,其核心价值在于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在之后能够将该对象恢复到原先保存的状态。 https://blog.csdn.net/ZxqSoftWare/article/details/149712206?ops_request_misc=%257B%2522request%255Fid%2522%253A%252299945c753ba5cd13ba1abf9c2213f646%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=99945c753ba5cd13ba1abf9c2213f646&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-149712206-null-null.142^v102^control&utm_term=%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

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

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

相关文章

SpringBoot 多环境配置

在实际项目开发中&#xff0c;不同环境往往有不同的配置需求&#xff1a; 开发环境&#xff08;dev&#xff09;&#xff1a;本地调试&#xff0c;连接测试数据库&#xff1b;测试环境&#xff08;test&#xff09;&#xff1a;接口联调&#xff0c;接近真实场景&#xff1b;生…

延凡智慧医院数字孪生平台

延凡智慧医院数字孪生平台是延凡科技依托物联网、数字孪生、AI 算法及边缘计算技术打造的医疗场景全要素数字化解决方案&#xff0c;通过构建医院物理实体与虚拟空间的实时映射&#xff0c;实现医疗资源优化、运营效率提升及患者体验升级。一、平台价值&#xff08;一&#xff…

谈谈WebAssembly、PWA、Web Workers的作用和场景

WebAssembly、PWA 和 Web Workers 是现代 Web 开发中提升性能、扩展能力的重要技术&#xff0c;各自解决不同场景的问题&#xff0c;以下结合实际使用经验分析&#xff1a;一、WebAssembly&#xff08;Wasm&#xff09;&#xff1a;高性能代码执行作用&#xff1a;WebAssembly …

嵌入式第十八课!!数据结构篇入门及单向链表

在前几章对C语言的学习中&#xff0c;我们学到了&#xff1a;基本的C语法和简单算法面向过程的编程思想而在数据结构这一篇章&#xff0c;我们将要学习&#xff1a;常用的数据存储结构算法面向对象的编程思想数据结构在正式开始学习之前&#xff0c;我们先来了解一下什么是数据…

win10任务栏出问题了,原来是wincompressbar导致的

问题描述兄弟们客户说自己电脑现在有问题了&#xff0c;任务栏显示的都不对&#xff0c;和之前的都不一样&#xff0c;现在使用起来非常难受&#xff0c;我们来看一下&#xff0c;这到底是什么问题吧&#xff01;到客户现场&#xff0c;查看发现&#xff0c;客户桌面系统最底下…

FFmpegHandler 功能解析,C语言程序化设计与C++面向对象设计的核心差异

FFmpegHandler 功能解析 本文件记录了关于 FFmpegHandler 类中核心函数工作流程的详细解释。Q: FFmpeg逐帧解码&#xff0c;FFmpegHandler::openVideo 和 FFmpegHandler::readAVFrame 这两个函数都分别做了什么&#xff1f; A: 可以把整个过程想象成“准备播放一部电影”&#…

Codeforces Round 1039 (Div. 2) A-C

A. Recycling Center题目大意 给你n个垃圾袋&#xff0c;每个垃圾袋有一个重量 在每秒钟&#xff0c;你可以选择一个垃圾袋&#xff0c;如果他的重量小于等于c&#xff0c;那么你可以不花费硬币丢掉它 当你丢掉一个垃圾袋后&#xff0c;其他垃圾袋在这一秒重量会翻倍 问最少花费…

【设计模式】 原则

单一职责原则 对于一个类而言&#xff0c;有且仅有一个引起他变化的原因或者说&#xff0c;一个类只负责一个职责 如果一个类承担的职责过多&#xff0c;那么这些职责放在一起耦合度太高了&#xff0c;一个职责的变化可能会影响这个类其他职责的能力。 所以我们在做软件设计的时…

windows11右键菜单新增项增加drawio文件,使用draw.io

目录1.新建空白模板2.建立注册表文件1.新建空白模板 这里我们的模板文件路径为 D:\Software\drawio\template.drawio 2.建立注册表文件 首先新建一个.txt文件&#xff0c;我这里取名为menulize.txt&#xff0c;然后将下面的内容复制到.txt文件中 Windows Registry Editor Ver…

解锁网页魔法:零基础HTML通关秘籍

文章目录**解锁网页魔法&#xff1a;零基础HTML通关秘籍**HTML 基础目标HTML 结构认识 HTML 标签HTML 文件基本结构标签层次结构快速生成代码框架HTML 常见标签注释标签注释的原则标题标签: h1-h6段落标签: p换行标签&#xff1a;br综合案例: 展示博客超链接标签: a表格标签**基…

类似 Pixso 但更侧重「网页 / 软件界面设计」「前后端可视化开发」的工具

从 GoView 的 Demo 功能来看&#xff0c;它主要聚焦于数据可视化大屏的低代码搭建&#xff0c;更侧重数据图表配置和页面布局&#xff0c;没有类似 Pixso 的在线 UI 设计&#xff08;如矢量绘图、组件样式精细化设计&#xff09;功能&#xff0c;其核心是通过预设组件快速构建数…

MySQL--组从复制的详解及功能演练

2.MySQL的组从复制 2.1 配置mastesr [rootmysqlaa ~]# vim /etc/my.cnf [mysqld] server-id10 datadir/data/mysql socket/data/mysql/mysql.sock default_authentication_pluginmysql_native_password log-binmysql-bin[rootmysqlaa ~]# /etc/init.d/mysqld restart# 进入数据…

JavaScript将String转为base64 笔记250802

JavaScript将String转为base64 笔记250802 在 JavaScript 中将字符串转换为 Base64 编码有多种方法&#xff0c;每种方法都有其适用场景。下面我将全面介绍这些方法&#xff0c;包括处理 ASCII 字符、Unicode 字符以及性能优化方案。 基础方法&#xff1a;btoa() 基本用法&a…

Unity3D数学第四篇:射线与碰撞检测(交互基础篇)

Unity3D数学第一篇&#xff1a;向量与点、线、面&#xff08;基础篇&#xff09; Unity3D数学第二篇&#xff1a;旋转与欧拉角、四元数&#xff08;核心变换篇&#xff09; Unity3D数学第三篇&#xff1a;坐标系与变换矩阵&#xff08;空间转换篇&#xff09; Unity3D数学第…

数据处理和统计分析——09 数据分组

1 聚合 1.1 简介 在SQL中我们经常使用GROUP BY将某个字段&#xff0c;按不同的取值进行分组&#xff0c;在Pandas中也有groupby()函数&#xff1b;分组之后&#xff0c;每组都会有至少1条数据&#xff0c;将这些数据进一步处理返回单个值的过程就是聚合&#xff0c;比如分组之后…

【数据结构与算法】数据结构初阶:排序内容加餐(一)——快速排序:三路划分、自省排序

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

MySqL(加餐)

范式第一范式数据库表的每一列都是不可分割的原子数据项&#xff0c;而不能是集合&#xff0c;数组&#xff0c;对象等非原子数据。在关系型数据库的设计中&#xff0c;满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不能被称为关系数据库。第一范式实际上只要…

【redis】基于工业界技术分享的内容总结

Redis 实践指南与核心概念 一、Java 中常用的 Redis 使用场景与实践 缓存&#xff08;Caching&#xff09; 场景&#xff1a;热点数据、频繁访问的数据&#xff0c;如商品详情、用户信息。通过缓存减少数据库压力&#xff0c;提高系统响应速度。 工业界实践&#xff1a; 淘宝…

服务端之nestJS常用异常类及封装自定义响应模块

MENU前言常用异常类&#xff08;由nestjs/common提供&#xff09;示例自定义异常&#xff08;可选&#xff09;自定义响应模块前言 在NestJS中&#xff0c;nestjs/common提供了大量的内置异常类&#xff0c;主要用于在控制器、服务等层抛出特定的HTTP错误响应。 常用异常类&…

数据链路层、NAT、代理服务、内网穿透

目录 一. 以太网 以太网帧格式 二. MAC地址 三. MTU 四. ARP协议 五. NAT NAPT 六. 代理服务器 正向代理 反向代理 七. 内网穿透 八. 内网打洞 一. 以太网 • "以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内 容, 也包含了一些物理层…