设计模式-备忘录模式(Memento Pattern)结构|原理|优缺点|场景|示例

本文主要是介绍设计模式-备忘录模式(Memento Pattern)结构|原理|优缺点|场景|示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


备忘录模式(Memento Pattern)是一种行为设计模式,它提供了一种在不破坏封装性的前提下,捕获并外部化对象的内部状态,并能在需要时恢复该对象状态的方法。这种模式主要用于实现撤销操作,回滚到之前的状态,或者记录一个对象的一系列状态,以便将来恢复。

结构: 备忘录模式包含以下几个主要角色:

  1. Originator(发起人):创建并保存其内部状态的快照,同时定义恢复状态的方法。
  2. Memento(备忘录):存储Originator对象的内部状态,但对外界隐藏具体实现细节,只暴露有限的接口防止外部对状态的非法访问。
  3. Caretaker(管理者/保姆):负责持有Memento对象,不直接访问Memento的内容,只是简单地存储和提供给Originator。

原理:

  • 发起人(Originator)在需要保存状态时,创建一个备忘录(Memento)对象,该对象包含了发起人的当前状态。
  • 发起人将备忘录对象传递给管理者(Caretaker)保管,但不暴露备忘录的具体实现细节。
  • 当需要恢复状态时,发起人从管理者那里取回备忘录对象,并根据其中的信息恢复到之前的状态。

优缺点: 优点:

  • 提供了状态恢复的能力,使得用户可以方便地回到某个历史状态。
  • 改善了封装性,状态的存储由备忘录对象管理,外部对象无法直接访问内部状态。
  • 支持撤销操作,增强了系统的灵活性和可维护性。

缺点:

  • 如果状态数据庞大,可能会占用大量的存储空间。
  • 需要谨慎管理备忘录,避免无限制增长导致资源消耗问题。
  • 增加了系统的复杂度,特别是在需要管理多个状态版本的情况下。

应用场景:

  • 文档编辑器中的撤销/重做功能。
  • 游戏中的存档/读档功能。
  • 配置设置的保存与恢复。
  • 事务处理中的回滚机制。

代码示例(以Java为例)

// Memento类,存储Originator的状态
class TextEditorMemento {private String content;public TextEditorMemento(String content) {this.content = content;}String getContent() {return content;}
}// Originator类,即文本编辑器
class TextEditor {private String content;public void type(String text) {content += text;System.out.println("Typed: " + text);}public TextEditorMemento save() {return new TextEditorMemento(content);}public void restore(TextEditorMemento memento) {content = memento.getContent();System.out.println("Restored: " + content);}
}// Caretaker类,负责存储Mementos
class Caretaker {private List<TextEditorMemento> history = new ArrayList<>();void addMemento(TextEditorMemento memento) {history.add(memento);}TextEditorMemento getMemento(int index) {return history.get(index);}
}// 使用示例
public class MementoDemo {public static void main(String[] args) {TextEditor editor = new TextEditor();Caretaker caretaker = new Caretaker();editor.type("Hello, ");caretaker.addMemento(editor.save());editor.type("World!");caretaker.addMemento(editor.save());editor.type(" How are you?");System.out.println("Current text: " + editor.getContent());editor.restore(caretaker.getMemento(1));System.out.println("After restore: " + editor.getContent());}
}

 在这个例子中,TextEditor作为发起人,记录并恢复文本状态;TextEditorMemento是备忘录,保存了文本内容;Caretaker作为管理者,存储并提供备忘录。通过这样的设计,我们可以轻松实现文本编辑器的撤销功能。

这篇关于设计模式-备忘录模式(Memento Pattern)结构|原理|优缺点|场景|示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947661

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制