备忘录模式:恢复对象状态的智能方式

news2024/11/27 22:25:17

在软件开发中,备忘录模式是一种行为型设计模式,它允许捕获并外部化对象的内部状态,以便在未来某个时刻可以将对象恢复到此状态。这种模式是撤销操作或者回滚操作的关键实现机制。本文将详细介绍备忘录模式的定义、实现、应用场景以及优缺点。
在这里插入图片描述

1. 备忘录模式的定义

备忘录模式(Memento Pattern)提供了一种方式,使得对象能保存其当前状态,并在需要时恢复到这个状态,而不暴露对象的实现细节。备忘录模式通常涉及三个参与者:原发器(Originator),备忘录(Memento),和管理者(Caretaker)。

2. 实现备忘录模式

在Python中,实现备忘录模式通常涉及创建备忘录类以保存原发器对象的状态,原发器类以管理状态,以及管理者类以保管备忘录。以下是备忘录模式的一个简单实现示例:

import copy

class Memento:
    """备忘录,存储原发器对象的状态"""
    def __init__(self, state):
        self._state = copy.deepcopy(state)

    def get_saved_state(self):
        return self._state

class Originator:
    """原发器,创建一个备忘录,用以记录当前时刻它的内部状态"""
    def __init__(self, state):
        self._state = state

    def set(self, state):
        print(f"Originator: Setting state to {state}")
        self._state = state

    def save_to_memento(self):
        print(f"Originator: Saving to Memento.")
        return Memento(self._state)

    def restore_from_memento(self, memento):
        self._state = memento.get_saved_state()
        print(f"Originator: State after restoring from Memento: {self._state}")

class Caretaker:
    """管理者,负责保存好备忘录"""
    def __init__(self):
        self._saved_states = []

    def add_memento(self, memento):
        self._saved_states.append(memento)

    def get_memento(self, index):
        return self._saved_states[index]

# 客户端代码
originator = Originator('Initial State')
caretaker = Caretaker()

caretaker.add_memento(originator.save_to_memento())
originator.set("State #1")
caretaker.add_memento(originator.save_to_memento())
originator.set("State #2")

originator.restore_from_memento(caretaker.get_memento(0))

3. 备忘录模式的应用实例

备忘录模式在许多场景中非常有用,尤其适用于:

  • 软件撤销操作:允许用户撤销或恢复命令。
  • 游戏保存和加载:保存当前游戏状态,以便可以从相同点重新开始。
  • 数据库事务管理:用于事务的回滚,恢复到事务开始前的状态。

4. 优点和缺点

优点:

  • 提供了一种恢复状态的清晰机制。
  • 通过保存历史记录来支持撤销操作。

缺点:

  • 可能消耗大量内存,如果状态历史保持不当。
  • 实现可能相对复杂,需要维护适当的备忘录和原发器状态。

5. 总结

备忘录模式是一个极其有用的设计模式,尤其在需要撤销和恢复功能的复杂系统中。正确的使用备忘录模式可以显著提高系统的可靠性和用户体验。

更多Python编程相关文章:cpython666.github.io

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

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

相关文章

【产品经理修炼之道】- 产品经理如何做用户行为分析

一、为什么要做用户行为分析 观点一:有些功能整个平台用户都希望做,是没有必要耗费人力评估的,只要做了就可以了。用户行为分析是形式,不能为了分析而分析。观点二:我都在这个行业做了这么多年了,用户需要…

掼蛋小技巧(上篇)

一、一火保两单 如果手中的牌可以组成同花顺并且不会造成两张以上的单牌,我们就可以组成同花顺;如果组了同花顺后有两张以上的单张则果断放弃组同花顺。 二、十张出一对,九张出单张 掼蛋残局的时候,如果判断出下家手上只有一个四头…

pyqt的人脸识别 基于face_recognition库

参考文献: 1、python face_recognition实现人脸识别系统_python facerecognition检测人脸-CSDN博客 2、cv2.VideoCapture()_cv2.videocapture(0)-CSDN博客 1、camera.py文件代码如下;目录如下 import sys from PyQt5.QtWidgets import QApplication, …

JVM主要知识点详解

目录 1. 性能监控和调优 1.1 调优相关参数 1.2 内存泄漏排查 1.3 cpu飙⾼ 2. 内存与垃圾回收 2.1JVM的组成(面试题) 2.2 Java虚拟机栈的组成 2.3 本地方法栈 2.4 堆 2.5 方法区(抽象概念) 2.5.1 方法区和永久代以及元空…

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间,节省…

两部电话机怎样能实现对讲?直接连接能互相通话吗?门卫门房传达室岗亭电话怎么搞?

目录 两部电话机能直接连接吗?用三通头分出来一条电话线两部电话机用一根电话线直接连接能互相通话吗? 什么电话机可以直接连接两部IP电话机(网络电话机)可以直接连接两部普通电话机之间通过一个电话交换机也可以连接跨区域的两部…

代码随想录算法训练营第四十一天|343.整数拆分、96.不同的二叉搜索树

代码随想录算法训练营第四十一天|343.整数拆分、96.不同的二叉搜索树 343.整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n…

模仿银行系统的极简Java三层结构应用——存钱功能的实现

一,前提: 我们上次做了一个简易的银行系统,初步认识了java结构,目前该系统可以输入要用的数据并且输出。 二,目标: 我们这次的目标是实现一个简易的存钱功能,并输出存钱后的余额,…

【JavaSE】搞定String类

前言 本篇会细致讲解String类的常见用法,让小伙伴们搞定String类~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 常用的三种字符串构造 字符串长度length 字符串比较 比较 比较字符串的内容equals…

赢战2024!炼石天津落地暨开年冲锋启动会圆满成功

天津,因河而生,凭海而兴,京杭大运河穿城而过,黄崖关长城迤逦壮观。2024年3月8日,“炼石天津落地暨开年冲锋启动会”在天津圆满成功举行,天津天开发展集团有限公司、中国电信股份有限公司天津分公司、中国联…

LeetCode 94 二叉树的中序遍历

题目描述 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入…

微信小程序-长按显示,点击空白区域关闭

<view bind:tap"closeLongAction"><view bind:longpress"openAction></view><view wx:if"{{longActionIsShow}}"> 长按显示的区域 </view> </view>openAction(e) {console.log(322,e);this.setData({longActionI…

Python疑难杂症(17)---介绍Python的pandas模块特点、安装以及series的创建和元素值的获取等。对于一维数据和使用有了初步的概念

1、定义 什么是Pandas&#xff1a;Pandas是Python中用于数据分析和挖掘的基础模块&#xff0c;它提供了丰富的功能和方法&#xff0c;使用 Pandas 包可以完成数据读入、数据清洗、数据准备、图表呈现等内容&#xff0c;使普通的非数据专业人员也能够处理和分析大型数据集&…

多传感器时间序列信号的无监督深度异常检测

论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/9507359 论文源码&#xff1a;未开源 期刊&#xff1a;IEEE Transactions on Knowledge and Data Engineering 如今&#xff0c;多传感器技术被应用于许多领域&#xff0c;如医疗保健(HC)、人体活动识别(…

二.吊打面试官系列-数据库优化-Explain索引分析

1.如何定位慢SQL 我们知道数据库瓶颈80%都在查询上&#xff0c;数据库优化有一个比较重要的环节就是定位系统中的慢SQL&#xff0c;那么我们如何快速定位到哪些查询语句比较耗时呢&#xff1f;Mysql有自己的慢SQL定位功能 MySQL的慢查询日志&#xff0c;用来记录在MySQL中响应…

Postman 环境变量配置初始调用登录脚本赋值Token

效果 新建环境 切换 Environments 标签下 点击上面加号增加环境变量 使用环境变量 使用{{变量名}}引用变量使用 Pre-request Script 全局 一般授权接口都需要再调用接口前&#xff0c;进行登录授权&#xff0c;这里使用了全局的请求前脚本调用。 脚本示例 // 基础地址 var…

【火猫TV】NBA:赛季数据王总结,国王双雄爆冷入选

NBA常规赛已经全部结束,各项数据王诞生,我们发现不少新人球星开始挑大梁,他们用出色的发挥证明了自己的实力。下面,为大家简单盘点下各项数据的最佳球员! 得分王:东契奇(场均33.9分) 本赛季独行侠低开高走,东契奇保持了出色发挥,他场均贡献33.9分,比第二的字母哥场均多出3.5分…

CAN网络管理(网络节点)

什么是CAN的网络节点 网络节点是指连接到CAN总线上的设备或模块,每个网络节点都具有唯一的标识符,称为节点ID,用于在CAN总线上进行通信和识别。 如何判断CAN的网络节点是多少 可以根据DBC来定义查看, 以ADCU为例,域控作为主节点,一般外部的像雷达,camera的数据都是向…

Tomcat下载配置地址

IntelliJ IDEA是一个强大的集成开发环境&#xff0c;能够大大简化Java应用程序的开发和部署过程。而Tomcat作为一个流行的Java Web服务器&#xff0c;其与IntelliJ IDEA的整合能够提供便捷的开发环境&#xff0c;让开发人员更专注于代码的创作与优化。 在配置IntelliJ IDEA以使…

鸿蒙应用开发之滑动选择组件

前面学习了下拉选择菜单组件,现在来学习滑动选择组件,它是提供快速调节设置值,如音量调节、亮度调节等应用场景。也就是说,这个组件可以通过滑动条来设置对应的数值,而不需要用户手动输入数字。 比如像下面的界面: 可以用手滑动上面的滑块,就可以调节对应的数字。这个组…