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

news2024/11/17 11:56:21

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

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

🔍 技术导航:

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

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

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

文章目录

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

1. 背景介绍

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

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

2. 原理

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

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

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

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

class Originator:
    def __init__(self):
        self._state = None

    def set_state(self, state):
        self._state = state

    def get_state(self):
        return self._state

    def 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 = state

class Originator:
    def __init__(self):
        self._state = None

    def set_state(self, state):
        self._state = state
        print(f"Originator: My state is '{self._state}'")

    def get_state(self):
        return self._state

    def save_to_memento(self):
        return Memento(self._state)

    def restore_from_memento(self, memento):
        self._state = memento._state
        print(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 state
        pass

    def restore_state(self, memento):
        # Implementation of restoring state
        pass

# 客户端代码
if __name__ == "__main__":
    editor = GraphicEditor()
    editor.save_state()
    editor.save_state()
    editor.undo()
    editor.undo()

6. 总结

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

结语

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速理解使用mq(二)——用户、虚拟HOST、Queue的创建

一、用户的创建 直接添加即可 二、虚拟Host创建 创建完成选择所属用户 点进去新建的host 管理对应权限 三、queue 创建 选择对应host 直接添加即可

系统分析师14:需求工程

1 内容概要 2 需求工程概述 需求工程:需求开发【含需求分析】和需求管理系统分析:软件需求分析、硬件需求分析、网络需求分析软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望考虑“做什么”,而不考虑“怎么做”&#xff0c…

2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点

云计算de小白 投资人工智能:平衡潜力与实用性 到 2025 年,人工智能将成为 IT 支出的重要驱动力,尤其是在生成式人工智能领域。人工智能的前景在于它有可能彻底改变业务流程、增强决策能力并开辟新的收入来源。然而,现实情况更加微…

4款工具搞定PDF去水印,线上+软件一应俱全!

作为一名文员,我每天都得和各种文档打交道,其中PDF文件是最常见的。有时候,我们收到的PDF文件会带有水印,这不仅影响了阅读体验,还可能在分享时造成不便。所以,学会如何去除PDF水印对我来说至关重要。今天&…

力扣 滑动窗口最大值

滑动窗口最大值 题目描述 题目分析 维护一个定长窗口的最大值,每当窗口滑动时都有一个新的元素进入和一个原有的元素离开。 比较简单的方法就是用一个优先队列维护窗口最大值 但是堆的计算成本时最坏时是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 优化:…

uni-app在线预览pdf

这里推荐下载pdf.js 插件 PDF.js - Browse Files at SourceForge.net 特此注意 如果报 Promise.withResolvers is not a function 请去查看版本兼容问题 降低pdf.js版本提高node版本 下载完成后 在 static 文件夹下新建 pdf 文件夹,将解压文件放进 pdf 文件…

面试加分必看,11道接口安全测试面试题!

今天,分享一些在面试中可能会遇到的接口安全测试面试问题,助你在面试中从容不迫。 01.HTTPS 与 HTTP 的区别? 02.OSI七层模型是指? 03.你所知道的 HTTP 状态码? 04.你知道SQL注入吗? 05.SQL 注入与XSS…

Xiaojie雷达之路---doa估计(dbf、capon、music算法)

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,本篇文章主要是介绍一下雷达信号处理中的dbf、capon、music测角算法,一起来看看吧!!! 前言 本文从信号模型、dbf原理、capon原理、music原理以及代码仿真进行展开描述。 信号模型 阵列接收到…

c++与Python用笛卡尔的心形函数输出爱心

我突然想到输出爱心是否可以用笛卡尔的心形函数 在IDLE里用Python输出下面这个图形 在小熊猫c里用c输出下面这个图形 如果当你要输出这些的时候会怎么办 低级:纯输出 print( ********* ********* ***************** ***************** …

Github + Hexo + Shoka搭建个人博客以及遇到的部分问题

博客预览: 主页: 文章: 博客语言链接: 全部分类 |mmjon 不在能知,乃在能行 Shoka官方博客: Yume Shoka 優萌初華 有夢書架 (lostyu.me) 1、准备 1、github账号 :自行去github官网注册…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么,翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit() 新建文本文档后缀改成py 编写 运行 安装编写代码…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中,性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题,我们需要对 MySQL 进行性能剖析。那么,如何在 MySQL 中进行性能剖析呢?本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

$attrs 与 $listeners 怎么用

在组件 son、grandson 和 great-grandson 中都显示了 this is a sentence,而子组件 son 和孙组件 grandson 中都没有定义 props,说明 parent 组件中的数据正确的传递到了内部组件中。 打开控制台,分别点击组件 grandson 和 great-grandson 中…

用Python实现运筹学——Day 5: 单纯形法介绍

一、学习内容 1. 单纯形法的基本原理与步骤 单纯形法(Simplex Method)是求解线性规划问题的一种常用方法。它是一种迭代算法,用于在凸多边形的顶点上寻找目标函数的最优解,通常用于多变量的线性规划问题。单纯形法主要应用于线性…

如何查看上网记录及上网时间?5种按步操作的方法分享!【小白也能学会!】

“知己知彼,百战不殆”,在数字时代,了解自己的上网行为和时长,不仅能帮助我们更好地管理时间,还能提升工作效率和生活质量。 今天,我们就来分享五种简单易懂的方法,即便是网络小白也能轻松学会…

大模型分布式训练并行技术(九)-总结

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

基于Qt/C++UDP 调试软件功能及用途介绍

概述 UDP 调试软件是一个基于 Qt 框架的图形化应用程序,旨在提供一个简单易用的界面用于测试和调试 UDP(用户数据报协议)通信。该软件支持客户端和服务器模式,能够实现数据的发送和接收,方便开发者和网络工程师进行网…

PG数据库的Jsonb全文检索查询

1.操作键值对 PostgreSQL 对 jsonb 类型的筛选查询可以使用 -> 或者 ->> 操作符。 -> 操作符用于通过 JSON 对象中的键来获取对应的值。->> 操作符可以将获取到的值提取出来转化为字符串类型。 例如,下面是一个包含 jsonb 类型字段的表&#x…

企业IT安全重保服务:守护关键时刻的坚固防线

中国联通国际有限公司产品之IT安全重保服务:守护关键时刻的坚固防线 在数字化时代,信息安全已成为企业运营与国家安全的基石。随着各类重大活动、会议及内部专项工作的频繁举行,如何确保信息系统在关键时刻免受黑客攻击、网页篡改、病毒感染…

零工市场小程序的未来发展趋势

随着经济的发展,越来越多的人们选择了灵活就业的方式来工作,零工市场小程序作为灵活就业一个重要的媒介,未来的发展趋势如何呢? 其实在零工市场小程序中,有着大数据的分析、算法,可以精准的匹配到自由职业…