Python 如何实现备忘录设计模式?什么是备忘录设计模式?Python 备忘录设计模式示例代码

什么是备忘录(Memento)设计模式?

备忘录(Memento)设计模式是一种行为型设计模式,用于捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要时恢复对象到先前的状态。这种模式允许将对象状态的保存和恢复功能封装在备忘录对象中,同时不破坏对象的封装性。

在这里插入图片描述

主要角色

  1. 发起人(Originator): 这个角色创建一个包含其当前状态的备忘录,并可以使用备忘录恢复其状态。发起人可以在备忘录中存储和恢复状态。

  2. 备忘录(Memento): 这个角色存储了发起人的内部状态。备忘录对象可以包含发起人的状态快照,但不会暴露给其他对象。

  3. 管理者(Caretaker): 这个角色负责保存备忘录。它可能会保存多个备忘录,但不对备忘录的内容进行操作。

工作流程

  1. 发起人创建备忘录: 当发起人需要保存其状态时,创建一个备忘录,并将其内部状态保存到备忘录中。

  2. 发起人恢复状态: 如果需要恢复到之前的状态,发起人可以使用备忘录中保存的状态信息进行恢复。

优点:

  1. 封装性良好: 备忘录模式允许将对象状态的保存和恢复功能封装在备忘录对象中,不暴露给其他对象,从而保持了对象状态的封装性。

  2. 历史记录管理: 允许在不破坏对象封装性的情况下,保存对象状态的历史记录,方便实现撤销、恢复、回滚等功能。

  3. 支持撤销和恢复: 备忘录模式能够保存对象不同时间点的状态,支持对对象状态的撤销操作,使得系统更具有交互性和灵活性。

缺点:

  1. 资源消耗: 如果对象状态非常庞大或者备忘录对象的管理复杂,可能会消耗大量内存和计算资源,对系统性能产生影响。

  2. 状态管理复杂性: 当需要管理大量状态或者状态之间存在复杂的依赖关系时,备忘录模式可能会增加系统的复杂性和维护成本。

  3. 备忘录对象的访问限制: 在某些情况下,备忘录对象的状态可能需要在发起人之外的对象中使用,但备忘录模式通常会限制了状态的访问性。

总的来说,备忘录模式可以有效地保存对象状态,支持撤销和恢复操作,但在状态管理复杂、资源消耗和访问限制方面可能存在一些缺点。因此,在使用备忘录模式时需要权衡其优缺点,并根据实际情况进行合理的选择和应用。


Python 备忘录设计模式示例代码(一):

以下是备忘录模式的简单示例:

# 备忘录类
class Memento:def __init__(self, state):self._state = statedef get_state(self):return self._state# 发起人类
class Originator:def __init__(self):self._state = Nonedef set_state(self, state):self._state = statedef save_to_memento(self):return Memento(self._state)def restore_from_memento(self, memento):self._state = memento.get_state()# 管理者类
class Caretaker:def __init__(self):self._memento = Nonedef get_memento(self):return self._mementodef set_memento(self, memento):self._memento = memento# 客户端代码
if __name__ == "__main__":originator = Originator()caretaker = Caretaker()# 设置状态并保存到备忘录originator.set_state("State #1")caretaker.set_memento(originator.save_to_memento())# 修改状态originator.set_state("State #2")# 恢复状态originator.restore_from_memento(caretaker.get_memento())

这个示例展示了如何使用备忘录模式保存和恢复发起人对象的状态。发起人可以创建备忘录并将其状态保存到备忘录中,在需要时可以恢复到先前保存的状态。


Python 备忘录设计模式示例代码(二):

假设我们有一个电子邮件编辑器,在用户编辑邮件时需要实现撤销(Undo)功能,可以使用备忘录模式来保存不同编辑状态,以便用户可以撤销到先前的状态。

# 备忘录类
class EmailMemento:def __init__(self, content):self._content = contentdef get_content(self):return self._content# 发起人类
class EmailEditor:def __init__(self):self._content = ""def set_content(self, content):self._content = contentdef create_memento(self):return EmailMemento(self._content)def restore_from_memento(self, memento):self._content = memento.get_content()# 管理者类
class HistoryManager:def __init__(self):self._history = []def add_to_history(self, memento):self._history.append(memento)def get_last_memento(self):if self._history:return self._history.pop()# 客户端代码
if __name__ == "__main__":editor = EmailEditor()history = HistoryManager()# 编辑邮件内容并保存状态editor.set_content("First draft of the email.")history.add_to_history(editor.create_memento())# 编辑邮件内容editor.set_content("Second draft with more details.")# 恢复到先前的状态last_memento = history.get_last_memento()if last_memento:editor.restore_from_memento(last_memento)print(f"Restored to previous draft: {editor._content}")else:print("No more history to restore.")

这个示例模拟了一个简单的电子邮件编辑器。用户可以编辑邮件内容,并使用备忘录模式保存不同版本的邮件状态。通过管理者类,用户可以撤销到先前保存的状态,恢复邮件内容到之前的版本。


使用备忘录设计模式时,需要注意哪些地方?

使用备忘录设计模式时需要注意以下几个方面:

  1. 状态的复杂性: 考虑对象状态的复杂性和大小。如果状态非常庞大或者包含敏感信息,可能会导致备忘录对象的创建和管理变得复杂。在这种情况下,需要权衡保存状态的合适性和开销。

  2. 备忘录的生命周期: 确保备忘录的生命周期符合需求。备忘录应该在合适的时间创建和使用,以及在不需要时进行销毁,避免占用过多的资源。

  3. 封装性和隐私性: 保持备忘录的封装性和隐私性。确保备忘录对象的状态只有发起人可以访问和修改,其他对象不能直接操作备忘录对象的状态。

  4. 管理者的责任: 管理者(Caretaker)对于维护备忘录的历史记录和状态的正确恢复至关重要。管理者应该准确地管理备忘录的存储和恢复过程。

  5. 备忘录的可变性: 在某些情况下,备忘录对象的状态可能会发生变化。考虑到备忘录对象可能需要支持状态更新的情况,以便在恢复时能够正确地反映最新状态。

  6. 性能考虑: 对于大型状态或者频繁的状态保存操作,需要考虑备忘录模式对性能的影响,以及如何优化备忘录对象的创建和管理。

综上所述,使用备忘录模式时,需要关注状态的复杂性和大小、备忘录对象的封装性、生命周期管理以及对历史记录的正确恢复等方面,以确保备忘录模式的正确实现和使用。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

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

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

相关文章

R语言的入门学习

目录 准备工作导入csv数据集选择前200行作为数据集展示数据集的前/后几N行宏观分析删除缺失值构建直方图导出为图片 R语言常见图像类型例1:散点图例2:散点矩阵图 准备工作 安装教程: R语言和RStudio的下载安装(非常简便舒适&…

mysql优化之explain 以及 索引优化

Mysql安装文档参考:https://blog.csdn.net/yougoule/article/details/56680952 Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设…

MattML

方法 作者未提供代码

day07_数组初识

数组的概述 数组就是用于存储数据的长度固定的容器,保证多个数据的数据类型要一致。 数组适合做一批同种类型数据的存储 数组是属于引用数据类型, 数组变量名中存储的数组在内存中的地址信息。 数组中的元素可以是基本数据类型,也可以是引用…

Linux | 信号

目录 前言 一、信号基础概念 1、生活中的信号 2、Linux中的信号 二、信号的产生 1、接口介绍 2、信号产生的方式 (1)终端按键的方式产生信号 (2)系统调用接口 a、kill b、raise c、abort (3&#xff09…

思维模型 鲶鱼效应

本系列文章 主要是 分享 思维模型 ,涉及各个领域,重在提升认知。激发竞争,促进创新。 1 鲶鱼效应的应用 1.1 鲶鱼效应在组织管理中的应用 美国通用汽车公司是世界上最大的汽车制造企业之一,它曾经面临着生产效率低下、员工缺乏积…

IntelliJ IDEA 2023 v2023.2.5

IntelliJ IDEA 2023是一款功能强大的集成开发环境(IDE),为开发人员提供了许多特色功能,以下是其特色介绍: 新增语言支持:IntelliJ IDEA 2023新增对多种编程语言的支持,包括Kotlin、TypeScript、…

如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中

文章目录 第一步:准备 CentOS 服务器第二步:安装 Node.js 和 Docsify第三步:初始化 Docsify 项目第四步:本地预览 Docsify 项目第五步:配置 Nginx 服务器第六步:重启 Nginx 服务器拓展:使用 HTT…

维修一款20年前的电容测试表VC6013

一、大概情况 在咸鱼市场淘了一台VC6013电感测试表,本来想捡漏的,结果发现是一个大坑,不但被人维修过,还发现被拆了一些ic,网络上也找不到合适的图纸,只找到一份比较接近的图纸,但是比较下来还是…

十八、Linux任务调度crond和at

1、crond任务调度 crond进行 定时任务的设置 概述 任务调度:是指系统在某个时间执行的特定的命令或程序。 任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作:个别用户可希望执行某些程序…

16.live555mediaserver-保活机制

live555工程代码路径 live555工程在我的gitee下(doc下有思维导图、drawio图): live555 https://gitee.com/lure_ai/live555/tree/master 章节目录链接 0.前言——章节目录链接与为何要写这个? https://blog.csdn.net/yhb1206/art…

【MATLAB源码-第83期】基于matlab的MIMO中V-BALST结构ZF和MMSE检测算法性能误码率对比。

操作环境: MATLAB 2022a 1、算法描述 在多输入多输出(MIMO)通信系统中,V-BLAST(垂直波束形成层间空间时间编码技术)是一种流行的技术,用于提高无线通信的数据传输速率和容量。它通过在不同的…