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

主要角色
-
发起人(Originator): 这个角色创建一个包含其当前状态的备忘录,并可以使用备忘录恢复其状态。发起人可以在备忘录中存储和恢复状态。
-
备忘录(Memento): 这个角色存储了发起人的内部状态。备忘录对象可以包含发起人的状态快照,但不会暴露给其他对象。
-
管理者(Caretaker): 这个角色负责保存备忘录。它可能会保存多个备忘录,但不对备忘录的内容进行操作。
工作流程
-
发起人创建备忘录: 当发起人需要保存其状态时,创建一个备忘录,并将其内部状态保存到备忘录中。
-
发起人恢复状态: 如果需要恢复到之前的状态,发起人可以使用备忘录中保存的状态信息进行恢复。
优点:
-
封装性良好: 备忘录模式允许将对象状态的保存和恢复功能封装在备忘录对象中,不暴露给其他对象,从而保持了对象状态的封装性。
-
历史记录管理: 允许在不破坏对象封装性的情况下,保存对象状态的历史记录,方便实现撤销、恢复、回滚等功能。
-
支持撤销和恢复: 备忘录模式能够保存对象不同时间点的状态,支持对对象状态的撤销操作,使得系统更具有交互性和灵活性。
缺点:
-
资源消耗: 如果对象状态非常庞大或者备忘录对象的管理复杂,可能会消耗大量内存和计算资源,对系统性能产生影响。
-
状态管理复杂性: 当需要管理大量状态或者状态之间存在复杂的依赖关系时,备忘录模式可能会增加系统的复杂性和维护成本。
-
备忘录对象的访问限制: 在某些情况下,备忘录对象的状态可能需要在发起人之外的对象中使用,但备忘录模式通常会限制了状态的访问性。
总的来说,备忘录模式可以有效地保存对象状态,支持撤销和恢复操作,但在状态管理复杂、资源消耗和访问限制方面可能存在一些缺点。因此,在使用备忘录模式时需要权衡其优缺点,并根据实际情况进行合理的选择和应用。
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.")
这个示例模拟了一个简单的电子邮件编辑器。用户可以编辑邮件内容,并使用备忘录模式保存不同版本的邮件状态。通过管理者类,用户可以撤销到先前保存的状态,恢复邮件内容到之前的版本。
使用备忘录设计模式时,需要注意哪些地方?
使用备忘录设计模式时需要注意以下几个方面:
-
状态的复杂性: 考虑对象状态的复杂性和大小。如果状态非常庞大或者包含敏感信息,可能会导致备忘录对象的创建和管理变得复杂。在这种情况下,需要权衡保存状态的合适性和开销。
-
备忘录的生命周期: 确保备忘录的生命周期符合需求。备忘录应该在合适的时间创建和使用,以及在不需要时进行销毁,避免占用过多的资源。
-
封装性和隐私性: 保持备忘录的封装性和隐私性。确保备忘录对象的状态只有发起人可以访问和修改,其他对象不能直接操作备忘录对象的状态。
-
管理者的责任: 管理者(Caretaker)对于维护备忘录的历史记录和状态的正确恢复至关重要。管理者应该准确地管理备忘录的存储和恢复过程。
-
备忘录的可变性: 在某些情况下,备忘录对象的状态可能会发生变化。考虑到备忘录对象可能需要支持状态更新的情况,以便在恢复时能够正确地反映最新状态。
-
性能考虑: 对于大型状态或者频繁的状态保存操作,需要考虑备忘录模式对性能的影响,以及如何优化备忘录对象的创建和管理。
综上所述,使用备忘录模式时,需要关注状态的复杂性和大小、备忘录对象的封装性、生命周期管理以及对历史记录的正确恢复等方面,以确保备忘录模式的正确实现和使用。
本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇
相关文章:
Python 如何实现备忘录设计模式?什么是备忘录设计模式?Python 备忘录设计模式示例代码
什么是备忘录(Memento)设计模式? 备忘录(Memento)设计模式是一种行为型设计模式,用于捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要时恢复对象到先前的状态。这种模…...
LangChain 代理 Agent(学习笔记)
原文:LangChain 代理 Agent(学习笔记) - 尘叶心繁的专栏 - TNBLOG LangChain 代理 Agent(学习笔记) LangChain 代理 Agent(学习笔记) 简介Agent Zero-shot ReActStructured Input ReActOpenAI FunctionsConversationalSelf ask with searchReAct document storePlan…...
实验三 页面置换算法
一. 实验目的: 1、熟悉虚存管理的各种页面淘汰算法 二、实验环境: 硬件环境:计算机一台,局域网环境; 软件环境:Windows XP及以上版本 Professional操作系统平台,Visual C 6.0专业版或企业版…...
Node.js中的Buffer和Stream
Node.js中的Buffer和Stream 计算机只能理解二进制数据,即0和1形式的数据。这些数据的顺序移动称为流。以称为块(chunk)的破碎部分流式传输数据;计算机一收到数据块就开始处理数据,而不用等待整个数据。 我们这篇文章…...
3.5 Windows驱动开发:应用层与内核层内存映射
在上一篇博文《内核通过PEB得到进程参数》中我们通过使用KeStackAttachProcess附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存…...
【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!
导读:关于大学数学教材的吐槽似乎从来没停止过。有人慨叹:数学教材晦涩难懂。错!难懂,起码还可以读懂。数学教材你根本读不懂;也有人说:数学教材简直就是天书。 数学教材有好有坏,这话不假&…...
MatLab的下载、安装与使用(亲测有效)
1、概述 MatLab是由MathWorks公司开发并发布的,支持线性代数、矩阵运算、绘制函数和数据、信号处理、图像处理以及视频处理等功能。广泛用于算法开发、数据可视化、数据分析以及数值计算等。 Matlab 的主要特性包括: 简单易用的语法,使得程…...
无人智能货柜:引领便捷购物新体验
无人智能货柜:引领便捷购物新体验 无人智能货柜利用人工智能技术,将传统货架与电子商务相结合,形成智能销售终端。其采用先拿货后付款的购物模式,用户只需扫码、拿货、关门三个简洁流畅的步骤,极大地提升了消费者的购物…...
4.6 Windows驱动开发:内核遍历进程VAD结构体
在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descriptor即虚拟地址描述符,VAD是一个AVL自平衡二叉树,树的每一个节点代表一段虚…...
基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码
基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于世界杯优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…...
NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!
之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui,支持 VmessWSTLS。 最近 Docker 视频出的比较多,前阵子又出现了宝塔国内版存在隐私泄露的问题,很多小伙伴其实都不用宝塔了,那么,在我们现在…...
【网络奇遇记】那年我与计算机网络的浅相知
🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …...
LeetCode26.删除有序数组中的重复项(双指针法)
LeetCode26.删除有序数组中的重复项 1.问题描述2.解题思路3.代码 1.问题描述 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然…...
原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8
文章目录 前言一、原始代码二、对每一行代码的解释:总结 前言 这是该系列原型网络的最后一段代码及其详细解释,感谢各位的阅读! 一、原始代码 if __name__ __main__:##载入数据labels_trainData, labels_testData load_data() # labels_…...
黑马点评回顾 redis实现共享session
文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat,但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器…...
Redis篇---第八篇
系列文章目录 文章目录 系列文章目录前言一、说说 Redis 哈希槽的概念?二、Redis 常见性能问题和解决方案有哪些?三、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?前言 前些天发现了一个巨牛的人工智能学习网站…...
Unity使用Visual Studio Code 调试
Unity 使用Visual Studio Code 调试C# PackageManager安装Visual Studio EditorVisual Studio Code安装Unity 插件修改Unity配置调试 PackageManager安装Visual Studio Editor 打开 Window->PackageManger卸载 Visual Studio Code Editor ,这个已经被官方废弃安…...
【Linux】进程替换|exec系列函数
文章目录 一、看一看单进程版的进程替换二、进程替换的原理三、多进程版——验证各种程序替换接口exec系列函数execlexeclpexecvexecvp tipsexecleexecve 四、总结 一、看一看单进程版的进程替换 #include<stdio.h> #include<unistd.h> #include<stdlib.h>i…...
Java编程技巧:将图片导出成pdf文件
目录 一、pom依赖二、代码三、测试链接 一、pom依赖 <!-- pdf插件 start --> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.3</version> </dependency> <dependency…...
二项分布和泊松分布
一、二项分布 1.1 n重伯努利试验 若是二项分布,则必是n重伯努利试验概型。即:每次试验只有两种结果 与 ,且在每次试验中A发生的概率相等,即P(A)p,将这种试验独立重复n次,则称这种试验为n重伯努利试验&#…...
Windows苹果设备驱动终极指南:3分钟搞定iPhone/iPad连接难题
Windows苹果设备驱动终极指南:3分钟搞定iPhone/iPad连接难题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/…...
STM32单片机技术优势与应用指南
1. STM32的崛起背景与技术优势2007年之前,8位单片机市场被8051架构主导,16位市场则有MSP430等产品。这些传统MCU在简单控制领域表现出色,但随着物联网时代的到来,其局限性逐渐显现:性能瓶颈:8位机的处理能力…...
HUSB238 USB-C PD物理层驱动设计与ESP32集成指南
1. HUSB238 驱动库概述HUSB238 是由 Microchip 推出的 USB Type-C 和 USB PD(Power Delivery)源端(Source)控制器,专为高集成度、小尺寸 USB-C 充电应用设计。其核心功能包括:USB-C 插拔检测(CC…...
RAG(检索增强生成)面试指南
一、核心概念与流程什么是 RAG?解决了什么问题?RAG(Retrieval-Augmented Generation)将“外部知识检索”与“大模型生成”相结合。流程为:用户提问 → 从外部知识库检索相关信息 → 将检索结果与问题一同输入大模型 →…...
AI Agent自我进化底层教程(非常详细),收藏这一篇就够了!
一句话讲清楚👉🏻 MemSkill通过可学习和演进的"记忆技能"系统,让AI Agent能够动态选择和优化记忆操作,实现真正的自我进化。 背景:AI Agent的记忆困境 2026年,AI Agent已经成为人工智能领域最热…...
OpenClaw技能组合:Qwen3-4B串联多个自动化模块完成复杂任务
OpenClaw技能组合:Qwen3-4B串联多个自动化模块完成复杂任务 1. 为什么需要技能组合? 去年我接手了一个数据分析项目,需要每周从三个不同来源收集数据,清洗后生成可视化报告。最初我手动执行这些步骤,每次耗时近3小时…...
告别截图贴图!用MATLAB的text函数+LaTeX,在图像任意位置添加公式注释(含α, β, ∑等符号)
科研图像标注革命:MATLABLaTeX实现动态公式嵌入全攻略 在学术论文与科研报告中,数据可视化图表的质量直接影响研究成果的呈现效果。传统方式中,研究者往往需要先导出图像,再通过第三方软件(如Photoshop或PPT࿰…...
用Wireshark抓包分析CAN总线:手把手教你解码数据帧与遥控帧
用Wireshark抓包分析CAN总线:从数据捕获到故障诊断的完整指南 CAN总线作为现代汽车和工业控制系统的神经中枢,其通信质量直接关系到整个系统的可靠性。本文将带您深入实战,通过WiresharkPCAN-USB这套黄金组合,掌握从基础抓包到高级…...
Cursor Pro免费激活终极指南:3步永久解锁AI编程神器
Cursor Pro免费激活终极指南:3步永久解锁AI编程神器 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial…...
ABAQUS模拟CFRP约束型钢再生混凝土短柱复现:‘保姆级教程‘中的材料、相互作用设置与曲线...
ABAQUS,CFRP约束型钢再生混凝土短柱论文复现 CFRP材料 相互作用的设置 曲线的调试(前期刚度以及承载力) 保姆级教程打开ABAQUS第一件事先冲杯咖啡——这玩意儿的曲线调试能让你怀疑人生。今天咱们来折腾CFRP裹着型钢再生混凝土的短柱…...
