设计模式-备忘录模式(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

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP