Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 原理
  • 3. 使用场景
  • 4. 代码样例
  • 5. 实际应用案例
  • 6. 总结
      • 结语

1. 背景介绍

在软件编程中,能够保存和恢复对象的状态是一个常见需求,尤其是在需要实现撤销(Undo)功能的场景中。备忘录模式(Memento Pattern)允许在不破坏封装的前提下,捕获并保存一个对象的内部状态,并且可以恢复到先前的状态。本文将深入探讨Python中的备忘录模式,包括其背景、原理、使用场景、代码实现和实际应用案例。

备忘录模式是一种行为型设计模式,用于在不破坏对象的封装性的前提下,保存和恢复对象的状态。这种模式通常用于实现撤销功能,允许用户对操作进行回滚。
在这里插入图片描述

2. 原理

备忘录模式的核心原理包括:

  • 发起人(Originator):创建一个备忘录,用以记录当前时刻的内部状态,并可以利用该备忘录恢复内部状态。
  • 备忘录(Memento):负责存储发起人的当前状态,并可以防止其他对象访问。
  • 负责人(Caretaker):负责保存备忘录对象,但不能操作备忘录对象。

备忘录模式通过三个关键角色协同工作,提供了一种保存和恢复对象状态的机制,同时确保了对象的封装不受破坏。下面详细探讨备忘录模式的核心原理:

发起人(Originator)
发起人是需要被保存和恢复状态的对象。它定义了创建备忘录的方法,以及使用备忘录恢复状态的方法。发起人负责创建一个包含其当前状态的备忘录,并在需要时使用备忘录恢复其状态。发起人对自身的状态进行封装,确保备忘录中的状态数据是安全的。

class Originator:def __init__(self):self._state = Nonedef set_state(self, state):self._state = statedef get_state(self):return self._statedef save_to_memento(self):return Memento(self._state)def restore_from_memento(self, memento):self._state = memento._state

备忘录(Memento)
备忘录对象负责存储发起人的内部状态。备忘录通常包含发起人对象的私有数据,但它不会对外暴露这些数据。备忘录可以设计为只允许发起人对其进行读写操作,而其他对象只能对备忘录对象进行读取操作。

class Memento:def __init__(self, state):self._state = state

负责人(Caretaker)
负责人负责管理备忘录对象,它可能包含对备忘录的保存、删除等操作,但不会对备忘录中存储的状态数据进行任何操作。负责人可以保存多个备忘录对象,并且可以在需要时将它们提供给发起人进行状态恢复。

class Caretaker:def __init__(self):self._mementos = []def save_memento(self, memento):self._mementos.append(memento)def get_memento(self, index):return self._mementos[index]

通过这三个核心组件的协同工作,备忘录模式实现了以下目标:

  1. 封装性:发起人对象的内部状态被封装在备忘录对象中,外部对象无法直接访问这些状态。
  2. 撤销操作:通过备忘录对象,发起人对象可以恢复到之前的状态,实现了撤销操作。
  3. 解耦:发起人对象不需要知道备忘录对象是如何存储或管理状态的,实现了发起人对象与负责人对象之间的解耦。

备忘录模式非常适合于需要实现撤销/重做功能的系统,如文本编辑器、图形编辑器等。通过使用备忘录模式,可以在不破坏对象封装性的前提下,灵活地保存和恢复对象的状态。

3. 使用场景

备忘录模式适用于以下场景:

  • 需要保存和恢复对象的历史状态:如文本编辑器的撤销/重做功能。
  • 需要实现撤销操作但不希望破坏对象的封装性

4. 代码样例

以下是一个Python中实现备忘录模式的示例:

class Memento:def __init__(self, state):self._state = stateclass Originator:def __init__(self):self._state = Nonedef set_state(self, state):self._state = stateprint(f"Originator: My state is '{self._state}'")def get_state(self):return self._statedef save_to_memento(self):return Memento(self._state)def restore_from_memento(self, memento):self._state = memento._stateprint(f"Originator: My state has changed to '{self._state}'")class Caretaker:def __init__(self):self._mementos = []def save_memento(self, memento):self._mementos.append(memento)def get_memento(self, index):return self._mementos[index]# 客户端代码
if __name__ == "__main__":originator = Originator()originator.set_state("State 1")caretaker = Caretaker()caretaker.save_memento(originator.save_to_memento())originator.set_state("State 2")caretaker.save_memento(originator.save_to_memento())originator.restore_from_memento(caretaker.get_memento(0))originator.restore_from_memento(caretaker.get_memento(1))

5. 实际应用案例

假设我们正在开发一个图形编辑软件,需要允许用户撤销和重做他们对图形对象的修改。我们可以使用备忘录模式来实现这一需求。

class GraphicEditor:def __init__(self):self._states = []def save_state(self):state = self.get_current_state()memento = Memento(state)self._states.append(memento)print(f"Saved state: {state}")def undo(self):if self._states:memento = self._states.pop()self.restore_state(memento)print(f"Undid state to: {self.get_current_state()}")def get_current_state(self):# Implementation of getting current statepassdef restore_state(self, memento):# Implementation of restoring statepass# 客户端代码
if __name__ == "__main__":editor = GraphicEditor()editor.save_state()editor.save_state()editor.undo()editor.undo()

6. 总结

备忘录模式是一种非常实用的设计模式,它允许在不破坏对象封装性的前提下,捕获并保存对象的状态,并且可以恢复到先前的状态。这种模式在实现撤销/重做功能时非常有用。

结语

设计模式是软件设计中的艺术,备忘录模式作为其中的一种,为我们提供了一种优雅的方式来保存和恢复对象的状态。希望本文能够帮助你在Python项目中更好地应用备忘录模式,提升代码的质量和灵活性。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

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

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

相关文章

[Redis][Zset]详细讲解

目录 0.前言1.常见命令1.ZADD2.ZCARD3.ZCOUNT4.ZRANGE5.ZREVRANGE6.ZRANGEBYSCORE7.ZPOPMAX8.BZPOPMAX9.ZPOPMIN10.BZPOPMIN11.ZRANK12.ZREVRANK13.ZSCORE14.ZREM15.ZREMRANGEBYRANK16.ZREMRANGEBYSCORE17.ZINCRBY 2.集合间操作1.有序集合的交集操作2.ZINTERSTORE3.有序集合的并…

H5响应式的文化传媒娱乐公司HTML网站模板源码

源码名称:响应式的文化传媒娱乐公司HTML网站模板源码 源码介绍:一款自适应H5文化传媒娱乐公司官网源码,源码带有6个H5页面,可用于文化传媒和娱乐公司官网。 需求环境:H5 下载地址: https://www.51888w.c…

Netty系列-5 Netty启动流程

背景 Netty程序有固定的模板格式,以ServerBootstrap为例: public class NettyServer {public void start(int port) {ServerBootstrap serverBootstrap new ServerBootstrap();EventLoopGroup boosGroup new NioEventLoopGroup(1);EventLoopGroup workGroup ne…

Kubernetes配置管理(kubernetes)

实验环境: 在所有节点上拉取镜像;然后把资源清单拉取到第一个master节点上; 同步会话,导入镜像: configmap/secret 配置文件的映射 变量: 基于valuefrom的方式 cm--》pod 特点:变量的名称可…

[JavaEE] IP协议

目录 一、 IP协议 1.1 基本概念 1.2 协议头格式 1.3 特殊IP 二、 地址管理 2.1 网段划分 2.2 CIDR(Classless Interdomain Routing) 2.3 私有IP地址和公网IP地址 2.4 NAT(Network Address Translation)-网络地址转换 2.5 路由选择 三、数据链路层 3.1 认识以太网 3…

什么是AQS

目录 AQS 介绍 原理 以可重入的互斥锁 ReentrantLock 为例 以倒计时器 CountDownLatch 以例 AQS 资源共享方式 实现自定义同步器 示例 性能优化 AQS 介绍 AQS (AbstractQueuedSynchronizer ),抽象队列同步器。AQS 是一个功能强大且…

cmd命令大全详解

CMD是Windows操作系统中的命令行解释器,它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其简要说明: dir - 显示目录中的文件和子目录。 cmddir cd - 更改当前目录。 cmdcd [目录路径] mkdir - 创建新目录。 cmdmkdir [目录名] rmd…

Vue.js 与 Flask/Django 后端配合开发实战

Vue.js 与 Flask/Django 后端配合开发实战 在现代的 Web 开发中,前后端分离已成为一种主流架构,其中前端使用 Vue.js 等流行的框架,后端采用 Flask 或 Django 提供 API 接口。在这种开发模式下,前端负责页面的交互和动态效果&…

将Mixamo的模型和动画导入UE5

首先进入Mixamo的官网 , 点击 Character 选择一个模型 (当然你也可以自己上传模型/绑定动画) 然后点击下载 , 这个作为带骨骼的模型 选择FBX格式 , T Pose 直接下载 点击 Animations 选择动画 , 搜索 idle 默认站立动画 点击下载 , 格式选择 FBX , 不带模型只要骨骼 , 帧数选6…

前端面试经验总结2(经典问题篇)

谈谈你对前端的理解 前端主要负责产品页面部分的实现,是最贴近于用户的程序员。 基本工作要求: 1.参与项目,通过与团队成员,UI设计,产品经理的沟通,快速高质量的实现效果图,并能够精确到1px 2.做…

大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型,并且提供了丰富的训练算法,包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

TypeScript介绍和安装

TypeScript介绍 TypeScript是由微软开发的一种编程语言,它在JavaScript的基础上增加了静态类型检查。静态类型允许开发者在编写代码时指定变量和函数的类型,这样可以在编译时捕获潜在的错误,而不是等到运行时才发现问题。比如,你…

论文笔记:iCaRL: Incremental Classifier and Representation Learning

1. Contribution 提出了一种新的训练策略,iCaRL:允许以增量方式学习:只需要同时存在一小部分类别的训练数据,新类别可以逐步添加。同时学习分类器和数据表示:iCaRL能够同时学习强大的分类器和数据表示,这与…

[SAP ABAP] SELECTION-SCREEN

SELECTION-SCREEN用来调节系统生成的画面 REPORT z437_test_2024.TABLES: mara, zdbt_sch_437.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. " Title1 PARAMETERS:p_1 DEFAULT A,p_2 TYPE char10. SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN …

实现微信小程序中点击单词显示在input的交互功能指南

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

基于SSH的酒店管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSH的酒店管理系统拥有三种角色 管理员:用户管理、房间分类管理、房间信息管理、开房管理、退房管理、开房和预订记录查询等 前台:房间分类管理、房间信息管…

【Go】-Websocket的使用

目录 为什么需要websocket 使用场景 在线教育 视频弹幕 Web端即时通信方式 什么是web端即时通讯技术? 轮询 长轮询 长连接 SSE websocket 通信方式总结 Websocket介绍 协议升级 连接确认 数据帧 socket和websocket 常见状态码 gorilla/websocket实…

LaTex符号不好记忆?

总结在Matlab中常用的LaTeX符号如下: 1. **希腊字母**: - \alpha 表示 α - \beta 表示 β - \gamma 表示 γ - \delta 表示 δ - \epsilon 表示 ε - \zeta 表示 ζ - \eta 表示 η - \theta 表示 θ - \iota 表示 ι -…

1-仙灵之谜(区块链游戏详情介绍)

1-仙灵之谜(区块链游戏详情介绍) 前言(该游戏仅供娱乐)正文 前言(该游戏仅供娱乐) 依稀记得本科那会儿参加了一个区块链实验室,那时每周末大家都会爬山或者抽出一下午讨论区块链以及未来&#x…

全国省、市、县(区)土地利用类型及面积面板数据(2019-2022年)

土地利用类型是根据土地利用方式和地域差异对土地资源单元进行划分的基本土地地域单元。 2019年-2022年全国省、市、县(区)土地利用类型及面积面板数据_土地利用类型数据下载资源-CSDN文库https://download.csdn.net/download/2401_84585615/89466102 …