Python设计模式:备忘录模式

1. 什么是备忘录模式?

备忘录模式是一种行为设计模式,它允许在不暴露对象内部状态的情况下,保存和恢复对象的状态。备忘录模式的核心思想是将对象的状态保存到一个备忘录对象中,以便在需要时可以恢复到之前的状态。这种模式通常用于实现撤销操作或历史记录功能。

备忘录模式通常包含三个主要组成部分:发起人(Originator)、备忘录(Memento)和管理者(Caretaker)

  1. 发起人(Originator):发起人是需要保存其状态的对象。它负责创建一个备忘录以保存其当前状态,并可以使用备忘录恢复其状态。发起人通常包含一些业务逻辑和状态信息。
  2. 备忘录(Memento):备忘录用于存储发起人的内部状态。备忘录对象通常是不可变的,以防止外部对象修改其状态。备忘录只提供状态的存储,不提供任何业务逻辑。
  3. 管理者(Caretaker):管理者负责管理备忘录对象,保存和恢复发起人的状态。管理者不需要了解备忘录的具体内容,只需保存和恢复。它通常维护一个备忘录列表,以便在需要时可以访问。

备忘录模式在软件设计中具有多种优点:

  1. 封装性:备忘录模式可以在不暴露对象内部状态的情况下保存和恢复状态。发起人可以将其状态封装在备忘录对象中,外部对象无法直接访问或修改这些状态。
  2. 简化代码:通过将状态管理逻辑分离到备忘录对象中,可以简化发起人的代码。发起人只需关注其业务逻辑,而不必处理状态的保存和恢复。
  3. 支持撤销操作:备忘录模式可以轻松实现撤销操作,允许用户恢复到之前的状态。这在许多应用程序中都是一个重要的功能,例如文本编辑器、图形编辑器等。
# 备忘录类
class Memento:def __init__(self, state):self.__state = state  # 将状态设置为私有属性def get_state(self):return self.__state  # 提供访问方法# 发起人类
class TextEditor:def __init__(self):self.text = ""def set_text(self, text):self.text = textprint(f"Current text: '{self.text}'")def save(self):return Memento(self.text)def restore(self, memento):self.text = memento.get_state()print(f"Restored text: '{self.text}'")# 管理者类
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__":def test1():editor = TextEditor()editor.set_text("Hello, World!")memento = editor.save()  # 保存状态# 尝试直接访问 memento.__statetry:print(memento.__state)  # 这将引发 AttributeErrorexcept AttributeError:print("Cannot access memento state directly!")  # 这行会被执行# 正确的方式是使用 get_state 方法print(f"Accessing memento state through method: '{memento.get_state()}'")def test2():editor = TextEditor()caretaker = Caretaker()editor.set_text("Hello, World!")caretaker.save_memento(editor.save())  # 保存状态editor.set_text("Hello, Python!")caretaker.save_memento(editor.save())  # 保存新状态# 恢复状态editor.restore(caretaker.get_memento(0))  # 输出: Restored text: 'Hello, World!'def test3():editor = TextEditor()caretaker = Caretaker()# 设置文本并保存状态editor.set_text("Hello, World!")caretaker.save_memento(editor.save())editor.set_text("Hello, Python!")caretaker.save_memento(editor.save())# 撤销到之前的状态print("\nUndoing last operation:")last_memento = caretaker.get_memento(0)  # 获取第一个备忘录editor.restore(last_memento)  # 恢复到 'Hello, World!'# 继续撤销操作print("\nUndoing to initial state:")last_memento = caretaker.get_memento(1)  # 获取第二个备忘录editor.restore(last_memento)  # 恢复到 'Hello, Python!print('test1:')test1()print('\ntest2:')test2()print('\ntest3:')test3()
test1:
Current text: 'Hello, World!'
Cannot access memento state directly!
Accessing memento state through method: 'Hello, World!'test2:
Current text: 'Hello, World!'
Current text: 'Hello, Python!'
Restored text: 'Hello, World!'test3:
Current text: 'Hello, World!'
Current text: 'Hello, Python!'Undoing last operation:
Restored text: 'Hello, World!'Undoing to initial state:
Restored text: 'Hello, Python!'

代码解析

  • TextEditor 类是发起人,包含一个 text 属性来保存文本内容。
    • set_text 方法用于设置文本并打印当前状态。
    • save 方法创建并返回一个备忘录对象,保存当前文本状态。
    • restore 方法使用备忘录对象恢复文本状态
  • Memento 类用于存储发起人的状态。在这个例子中,它保存了文本编辑器的文本状态。
    • __state 属性用于保存发起人的内部状态,并通过 get_state 方法提供访问。
  • Caretaker 类负责管理备忘录对象,维护一个 mementos 列表来保存多个备忘录。
    • save_memento 方法用于将备忘录对象添加到列表中。
    • get_memento 方法根据索引返回相应的备忘录对象。
  • test1:Memento 类封装了 TextEditor 的内部状态。外部对象无法直接访问 Memento__state 属性,从而保护了发起人的内部状态。
  • test2:TextEditor 类的代码保持简洁,专注于文本的设置和恢复。状态的管理逻辑被转移到 Caretaker 类中,从而简化了发起人的代码。
  • test3: 用户可以通过 Caretaker 类保存多个备忘录,并在需要时恢复到之前的状态。通过调用 restore 方法,用户可以轻松实现撤销操作。

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

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

相关文章

Python基础语法3

目录 1、函数 1.1、语法格式 1.2、函数返回值 1.3、变量作用域 1.4、执行过程 1.5、链式调用 1.6、嵌套调用 1.7、函数递归 1.8、参数默认值 1.9、关键字参数 2、列表 2.1、创建列表 2.2、下标访问 2.3、切片操作 2.4、遍历列表元素 2.5、新增元素 2.6、查找元…

JavaEE学习笔记(第二课)

1、好用的AI代码工具cursor 2、Java框架:Spring(高级框架)、Servelt、Struts、EJB 3、Spring有两层含义: ①Spring Framework(原始框架) ②Spring家族 4、Spring Boot(为了使Spring简化) 5、创建Spring Boot 项目 ① ② ③…

基于Flask与Ngrok实现Pycharm本地项目公网访问:从零部署

目录 概要 1. 环境与前置条件 2. 安装与配置 Flask 2.1 创建虚拟环境 2.2 安装 Flask 3. 安装与配置 Ngrok 3.1 下载 Ngrok 3.2 注册并获取 Authtoken 4. 在 PyCharm 中创建 Flask 项目 5. 运行本地 Flask 服务 6. 启动 Ngrok 隧道并获取公网地址 7. 完整示例代码汇…

Ragflow、Dify、FastGPT、COZE核心差异对比与Ragflow的深度文档理解能力​​和​​全流程优化设计

一、Ragflow、Dify、FastGPT、COZE核心差异对比 以下从核心功能、目标用户、技术特性等维度对比四款工具的核心差异: 核心功能定位 • Ragflow:专注于深度文档理解的RAG引擎,擅长处理复杂格式(PDF、扫描件、表格等)的…

LeetCode[232]用栈实现队列

思路: 一道很简单的题,就是栈是先进后出,队列是先进先出,用两个栈底相互对着,这样一个队列就产生了,右栈为空的情况,左栈栈底就是队首元素,所以我们需要将左栈全部压入右栈&#xff…

postman 删除注销账号

一、删除账号 1.右上角找到 头像,view profile https://123456-6586950.postman.co/settings/me/account 二、找回账号 1.查看日志所在位置 三、postman更新后只剩下history 在 Postman 中,如果你发现更新后只剩下 History(历史记录&…

微服务相比传统服务的优势

这是一道面试题,咱们先来分析这道题考察的是什么。 如果分析面试官主要考察以下几个方面: 技术理解深度 你是否清楚微服务架构(Microservices)和传统单体架构(Monolithic)的本质区别。能否从设计理念、技术…

【KWDB 创作者计划】_深度学习篇---向量指令集

文章目录 前言一、加速原理数据级并行(DLP)计算密度提升减少指令开销内存带宽优化隐藏内存延迟二、关键实现技术1. 手动向量化(Intrinsics)优势挑战2. 编译器自动向量化限制3. BLAS/LAPACK库优化4. 框架级优化三、典型应用场景矩阵运算卷积优化归一化/激活函数嵌入层(Embe…

跳跃游戏(每日一题-中等)

题解:定义一个变量,用来存储可以到达的最远位置。初始化为0。 然后对数组进行遍历,遍历开始的时候,先判断当前这个位置和最远位置谁大,如果最远位置比较大,那么就说明当前这个位置也能达到,就看…

第七篇:linux之基本权限、进程管理、系统服务

第七篇:linux之基本权限、进程管理、系统服务 文章目录 第七篇:linux之基本权限、进程管理、系统服务一、基本权限1、什么是权限?2、为什么要有权限?3、权限与用户之间的关系?4、权限对应的数字含义5、使用chmod设定权…

音视频小白系统入门课-2

本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1 课程实践代码仓库:传送门 音视频编解码 可以通过ffmpeg -f avfoundation -list_devices true -i "&…

外卖“三国杀”开新局,饿了么已手握AI牌

【潮汐商业评论/原创】 01 新战役,新变量 外卖行业,又迎来了新一轮战役。 前有京东宣布斥资百亿进军外卖市场,后有美团宣布发布即时零售品牌“美团闪购”。双方在隔空秀肌肉、彰显自身实力的同时,行业巨头围绕本地生活服务的攻…

HAProxy 和 Keepalived 区别

HAProxy 和 Keepalived 是在构建高可用和可扩展Web服务时常用的两个开源软件,但它们的核心功能和目的有显著区别。 简单来说: HAProxy: 主要是一个 负载均衡器 (Load Balancer) 和 反向代理 (Reverse Proxy)。它负责将客户端的请求智能地分发到后端的多…

YOLO算法的革命性升级:深度解析Repulsion损失函数在目标检测中的创新应用

## 一、目标检测的痛点与YOLO的局限性 在自动驾驶、智能监控等复杂场景中,目标检测算法常面临致命挑战——遮挡问题。当多个物体相互遮挡时,传统检测器容易出现漏检、误检现象,YOLO系列算法尽管在速度与精度上表现优异,但在处理密集遮挡目标时仍存在明显短板。 ### 1.1 遮…

第一篇:Django简介

第一篇:Django简介 文章目录 第一篇:Django简介一、纯手写一个简易版的web框架1、软件开发架构2、HTTP协议3、简易的socket服务端4、wsgiref模块5、动静态网页6、后端获取当前时间展示到html页面上7、字典数据传给html文件8、数据从数据库中获取的展示到…

【笔记】CentOS7部署K8S集群

一、初始化(所有节点机器都要执行) 1. 关闭firewall防火墙 systemctl disable firewalld.service systemctl stop firewalld.service2. 关闭SELinux 临时关闭 setenforce 0永久关闭 vim /etc/selinux/config SELINUXenforcing 改成 SELINUXdisable…

Ethan独立开发产品日报 | 2025-04-22

1. Agent Simulate 用数千个数字人来测试你的人工智能应用。 Agent Simulate 让你在发布之前,能够在一个安全的环境中模拟和测试大型语言模型(LLM)代理。它帮助你调试行为、加快迭代速度,并降低生产风险,专为代理开发…

Photoshop安装与配置--简单攻略版

下载地址:Photoshop软件工具下载 安装完成后,即可运行Photoshop.exe;打开工具页面后,按照下面简单配置即可 1.编辑-》首选项-》常规 或者直接快捷键CtrlK 暂存盘:一定要设置为非C盘 2.性能 3.文件处理 以上配置比较基础&#xf…

新手村:正则化

机器学习-正则化方法 新手村:正则化 什么是正则化? 正则化(Regularization) 是一种用于防止机器学习模型 过拟合(Overfitting)的技术。它通过在模型的 损失函数 中添加一个 惩罚项(Penalty Ter…

C语言 ——— 分支循环语句

目录 分支循环语句 单分支 多分支 switch 分支语句 牛刀小试 判断一个数是否是奇数 输出 1-100之间 的奇数 计算 n 的阶乘 计算 1! 2! 3! ... n! 在一个有序数组中查找具体的某一个数字 打印 100-200 之间的素数 求两个整数的最大公约数 getchar函数 和 putc…