软件设计模式系列之二十——备忘录模式

news2024/11/28 23:37:12

备忘录模式目录

  • 1 模式的定义
  • 2 举例说明
  • 3 结构
  • 4 实现步骤
  • 5 代码实现
  • 6 典型应用场景
  • 7 优缺点
  • 8 类似模式
  • 9 小结

备忘录模式是一种行为型设计模式,它允许我们在不暴露对象内部细节的情况下捕获和恢复对象的内部状态。这个模式非常有用,因为它可以帮助我们实现撤销、恢复和历史记录等功能。在本文中,我们将深入探讨备忘录模式的各个方面,包括定义、示例、结构、实现步骤、代码实现、典型应用场景、优缺点、类似模式以及小结。

1 模式的定义

备忘录模式是一种行为型设计模式,它允许我们在不破坏封装性的前提下,捕获一个对象的内部状态,并在稍后将其恢复到先前的状态。备忘录模式的核心思想是将对象的状态保存在一个备忘录对象中,然后在需要时将状态从备忘录中还原回去。

备忘录模式的主要优势在于它可以帮助我们实现撤销和恢复功能,同时保持对象的封装性。此外,备忘录模式还可以用于实现历史记录和快照功能。

2 举例说明

备忘录通常用于捕获对象的内部状态,并在之后能够将对象恢复到先前的状态。以下是几个日常生活中常见且符合备忘录模式的例子:

文本编辑器的撤销功能。文本编辑器通常具有撤销(Undo)和重做(Redo)功能,它们可以帮助用户恢复到之前的编辑状态。这些功能使用备忘录模式来保存文本编辑器的历史状态,并允许用户在多个历史状态之间切换。
在这里插入图片描述

游戏存档。在电子游戏中,玩家可以在游戏进程中保存多个存档点,以便在之后恢复到先前的游戏状态。备忘录模式可以用于实现游戏的存档和还原功能,让玩家回到游戏的不同阶段。

浏览器的历史记录。Web浏览器的历史记录功能允许用户查看和导航他们之前访问过的网页。备忘录模式可用于记录用户浏览的历史状态,包括访问的网页、页面的滚动位置等信息。

这些例子都涉及到在不同时间点捕获和恢复对象的状态,以便用户能够回到之前的状态或历史记录。备忘录模式通过将对象的状态保存到备忘录对象中,并将备忘录存储在历史记录中,使得这种行为变得更加容易和可管理。

3 结构

备忘录模式的结构包括以下部分:

发起人(Originator):负责创建备忘录对象,并可以将其状态保存到备忘录中或从备忘录中恢复状态。
备忘录(Memento):负责存储发起人的内部状态,但不会暴露给其他对象。
管理者(Caretaker):负责管理备忘录对象,通常用于存储和检索备忘录对象,但不会访问备忘录的具体内容。
下面是备忘录模式的类图:
在这里插入图片描述

4 实现步骤

实现备忘录模式的关键步骤包括:

创建发起人(Originator)类,它负责维护内部状态,并可以创建备忘录对象和从备忘录对象中恢复状态。
创建备忘录(Memento)类,用于存储发起人的内部状态。备忘录类应该提供方法来获取和设置状态。
创建管理者(Caretaker)类,它负责管理备忘录对象。通常,管理者会维护一个备忘录列表,可以添加和检索备忘录对象。
在发起人类中添加方法来创建备忘录对象和从备忘录对象中恢复状态。

5 代码实现

下面是一个简单的Java示例,演示了备忘录模式的实现:

// 1. 发起人(Originator)类
class TextEditor {
    private String text;

    public void setText(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public TextEditorMemento createMemento() {
        return new TextEditorMemento(text);
    }

    public void restoreFromMemento(TextEditorMemento memento) {
        text = memento.getState();
    }
}

// 2. 备忘录(Memento)类
class TextEditorMemento {
    private String state;

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

    public String getState() {
        return state;
    }
}

// 3. 管理者(Caretaker)类
class History {
    private List<TextEditorMemento> mementos = new ArrayList<>();

    public void addMemento(TextEditorMemento memento) {
        mementos.add(memento);
    }

    public TextEditorMemento getMemento(int index) {
        return mementos.get(index);
    }
}

public class Main {
    public static void main(String[] args) {
        TextEditor textEditor = new TextEditor();
        History history = new History();

        // 用户编辑文本
        textEditor.setText("Hello, World!");
        history.addMemento(textEditor.createMemento());

        textEditor.setText("Updated Text");
        history.addMemento(textEditor.createMemento());

        // 恢复到之前的状态
        textEditor.restoreFromMemento(history.getMemento(0));
        System.out.println(textEditor.getText()); // 输出:Hello, World!
    }
}

6 典型应用场景

备忘录模式在以下情况下特别有用:

撤销和恢复功能:允许用户撤销操作并恢复到之前的状态,例如文本编辑器、图形设计工具等。
历史记录功能:记录对象的操作历史,以便用户可以查看和导航操作历史,例如浏览器的后退和前进功能。
快照功能:在不破坏对象封装性的情况下,捕获对象的状态快照,用于实现版本控制或数据恢复。

7 优缺点

备忘录模式具有以下优点和缺点:

优点:
封装性:备忘录模式允许将对象状态的存储和恢复细节封装在备忘录类中,不会破坏对象的封装性。
撤销和恢复:可以轻松实现撤销和恢复功能,用户可以回退到先前的状态。
简化备份管理:管理者类负责管理备忘录对象,使得备份管理更加灵活和可控。
支持历史记录:备忘录模式可用于实现历史记录和快照功能,有助于跟踪对象状态的变化。
缺点:
内存消耗:如果备忘录对象较大或备忘录列表很长,可能会导致内存消耗较高。
性能开销:创建和管理备忘录对象可能会引入性能开销,特别是在频繁保存和恢复状态时。
复杂性增加:在某些情况下,备忘录模式可能会增加代码的复杂性,特别是在有多个备忘录对象和多个发起人对象时。

8 类似模式

与备忘录模式类似的模式包括状态模式和命令模式。这些模式在某些方面与备忘录模式有联系,但它们各自关注不同的问题和解决方案。

状态模式 (State Pattern):

状态模式与备忘录模式联系在于它们都涉及到对象的状态管理。在状态模式中,对象的行为随状态的变化而变化,而备忘录模式关注状态的保存和恢复,以实现撤销和恢复功能。状态模式通过将状态封装成状态对象,使对象更容易维护和扩展。备忘录模式则主要用于保存和恢复对象的状态,以实现撤销和恢复功能。状态模式通常涉及更复杂的状态转换逻辑,而备忘录模式侧重于状态的历史记录和管理。

命令模式 (Command Pattern):

命令模式和备忘录模式都可以用于实现撤销和恢复功能。在命令模式中,命令对象将操作封装成对象,可以撤销和重做。备忘录模式关注状态的保存和恢复,以便撤销和恢复对象的整体状态。命令模式通常用于构建具有撤销和重做功能的交互系统,而备忘录模式更关注对象内部状态的历史记录和管理。备忘录模式不一定需要命令对象,而命令模式通常需要一个命令队列或历史记录来管理命令。

这些模式都关注对象状态的管理,但它们各自解决不同的问题。备忘录模式主要用于实现撤销和恢复功能,状态模式用于管理对象的状态转换,命令模式用于构建具有撤销和重做功能的交互系统,而快照模式可以用于快速保存和恢复对象的状态快照。在实际应用中,根据具体需求选择适当的模式以提高代码的可维护性和可扩展性。

9 小结

备忘录模式是一种非常有用的设计模式,可以帮助我们实现撤销、恢复、历史记录和快照等功能,同时保持对象的封装性。通过定义发起人、备忘录和管理者等角色,可以清晰地组织和管理对象状态的保存和恢复过程。

在实际应用中,备忘录模式通常与其他设计模式结合使用,以满足更复杂的需求。通过谨慎地选择何时使用备忘录模式,可以提高代码的可维护性和可扩展性,同时实现更强大的用户体验。

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

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

相关文章

HTML——列表,表格,表单内容的讲解

文章目录 一、列表1.1无序&#xff08;unorder&#xff09;列表1.2 有序&#xff08;order&#xff09;列表1.3 定义列表 二、表格**2.1 基本的表格标签2.2 演示 三、表单3.1 form元素3.2 input元素3.2.1 单选按钮 3.3 selcet元素 基础部分点击&#xff1a; web基础 一、列表 …

全面解析‘msvcp140.dll丢失的解决方法’这个问题

msvcp140.dll 是什么东西&#xff1f; msvcp140.dll 是 Microsoft Visual C 2015 Redistributable Package 中的一个动态链接库文件。它包含了 C运行时库中的函数和类&#xff0c;这些函数和类在开发 C应用程序时被广泛使用。msvcp140.dll 的主要作用是在 Windows 操作系统中提…

1.5.C++项目:仿mudou库实现并发服务器之socket模块的设计

项目完整版在&#xff1a; 一、socket模块&#xff1a;套接字模块 二、提供的功能 Socket模块是对套接字操作封装的一个模块&#xff0c;主要实现的socket的各项操作。 socket 模块&#xff1a;套接字的功能 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 …

WordPress外贸建站Astra免费版教程指南(2023)

在WordPress的外贸建站主题中&#xff0c;有许多备受欢迎的主题&#xff0c;如AAvada、Astra、Hello、Kadence等最佳WordPress外贸主题&#xff0c;它们都能满足建站需求并在市场上广受认可。然而&#xff0c;今天我要介绍的是一个不断颠覆建站人员思维的黑马——Astra主题。 …

【计算机网络】DNS原理介绍

文章目录 DNS提供的服务DNS的工作机理DNS查询过程DNS缓存 DNS记录和报文DNS记录DNS报文针对DNS服务的攻击 DNS提供的服务 DNS&#xff0c;即域名系统(Domain Name System) 提供的服务 一种实现从主机名到IP地址转换的目录服务&#xff0c;为Internet上的用户应用程序以及其他…

网页采集工具-免费的网页采集工具

在当今数字化时代&#xff0c;网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作&#xff0c;网页采集工具都扮演着不可或缺的角色。对于许多用户来说&#xff0c;寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

ElasticSearch更新数据后查不到的问题

一、前言 上一篇文章还是2个星期前写的&#xff0c;近段时间有点懒&#xff0c;本来这篇也不太愿意动笔写&#xff0c;但这两天关注数据&#xff0c;发现新的一年已经收获了4个粉丝&#xff0c;首先感谢大家的关注&#xff0c;我以后还是会尽量多写一点。这篇文章讲一下今天我…

从零手搓一个【消息队列】BrokerServer 创建核心类, 数据库设计与实现

文章目录 一、创建核心类1, 交换机2, 交换机类型3, 队列4, 绑定5, 交换机转发 & 绑定规则6, 消息7, 消息属性 二、数据库设计1, 使用 SQLite2, 使用 MyBatis2.1, 创建 Interface2.2, 创建 xml 文件 三、硬盘管理 -- 数据库1, 创建 DataBaseManager 类2, init() 初始化数据库…

【ONE·Linux || 多线程(一)】

总言 多线程&#xff1a;进程线程基本概念、线程控制、互斥与同步。 文章目录 总言1、基本概念1.1、补充知识1.1.1、堆区细粒度划分1.1.2、虚拟地址到物理空间的转化 1.2、如何理解线程、进程1.2.1、如何理解线程&#xff1f;1.2.2、如何理解进程&#xff1f; 1.3、实践操作1.…

职业规划,什么是职业兴趣 - 我喜欢做什么?

能够在工作岗位上面做出成绩的人&#xff0c;都是结合自身兴趣&#xff0c;对职业进行合理规划的那一类。尤其是步入中年以后&#xff0c;能够创造出巨大价值的人&#xff0c;无一例外都是喜欢自己职业的人。没有将兴趣融入工作的人&#xff0c;只能够忍受默默无闻地活着&#…

liunx的攻击

1.场景和分析 2.病毒分析 3.解决步骤

Linux学习记录——삼십일 socket编程---TCP套接字

文章目录 TCP套接字简单通信1、服务端1、基本框架2、获取连接 2、客户端3、多进程4、多线程5、线程池6、简单的日志系统7、守护进程8、其它 TCP套接字简单通信 本篇gitee 学习完udp套接字通信后&#xff0c;再来看TCP套接字。 四个文件tcp_server.hpp&#xff0c; tcp_serve…

黑豹程序员-放大招-架构师学习路线图

文章目录 全栈软件架构师技术路线六环能力图一、开发基础二、增强软件三、海量数据四、软件智能五、并发增强六、桌面开发 全栈软件架构师技术路线 六环能力图 作为软件开发&#xff0c;我们的任务就是开发软件业务系统。 如果要做好一个软件系统需要的技能是非常多的。我归纳…

分布式链路追踪--SkyWalking7.0.0+es7.0.0

分布式链路追踪–SkyWalking ​ 微服务的出现&#xff0c;的确解决了一些业务痛点&#xff0c;但是也造成了新的问题比如随着调用链的拉长&#xff0c;如果想要知道请求为什么这么慢&#xff0c;这个请求到底经历了哪些环节&#xff0c;又依赖了哪些东西&#xff0c;在微服务架…

基于Java的婚纱影楼管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Bluespec SytemVerilog 握手协议接口转换

01、引言 由于接口控制信号上的差异&#xff0c;要实现Bluespec SystemVerilog(BSV)生成的代码和外部Verilog代码之间的正确交互是一件比较麻烦同时容易出错的事情。在BSV中, 模块之间的交互都是基于Action或ActionValue这两类method完成。下图展示了使用BSV设计的某一模块的接…

综合应用QGIS软件,实现商场选址分析

一、实验要求 ①离城市主要交通道路50米内&#xff0c;保证商场交通的便利性。 ②在居民区100米内&#xff0c;便于居民步行到商场。 ③距离停车场100米内&#xff0c;便于顾客停车。 ④距离其他商场500米范围之外&#xff0c;减少竞争压力。 二、实验数据 ①城市地区主要…

机器学习算法基础--层次聚类法

文章目录 1.层次聚类法原理简介2.层次聚类法基础算法演示2.1.Single-linkage的计算方法演示2.2.Complete-linkage的计算方法演示2.3.Group-average的计算方法演示 3.层次聚类法拓展算法介绍3.1.质心法原理介绍3.2.基于中点的质心法3.3.Ward方法 4.层次聚类法应用实战4.1.层次聚…

Java21 新特性

文章目录 1. 概述2. JDK21 安装与配置3. 新特性3.1 switch模式匹配3.2 字符串模板3.3 顺序集合3.4 记录模式&#xff08;Record Patterns&#xff09;3.5 未命名类和实例的main方法&#xff08;预览版&#xff09;3.6 虚拟线程 1. 概述 2023年9月19日 &#xff0c;Oracle 发布了…