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

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

1. 备忘录模式的定义

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

2. 实现备忘录模式

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

import copyclass Memento:"""备忘录,存储原发器对象的状态"""def __init__(self, state):self._state = copy.deepcopy(state)def get_saved_state(self):return self._stateclass Originator:"""原发器,创建一个备忘录,用以记录当前时刻它的内部状态"""def __init__(self, state):self._state = statedef set(self, state):print(f"Originator: Setting state to {state}")self._state = statedef 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.mzph.cn/news/812385.shtml

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

相关文章

【linux深入剖析】深入理解基础外设--磁盘以及理解文件系统

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1.磁盘物理结构2.磁盘…

HiveSQL基础Day04

一、CTE语法 CTE语法类似子查询,可以将一个select语句计算的结果当成一个新的临时表使用 -- 子查询,将子查询的结果当做表使用 select empno,ename from ( select * from emp) t1; -- 基本用法 with 临时表名 as(查询语句) select * from 临时表名 ​ -…

SpringAI初体验之HelloWorld

目录 前言1.准备工作2.初始化项目3.解决问题3.1 Connection Time out 连接超时问题3.2 You exceeded your current quota 额度超限问题 4.访问调用5.总结 前言 在逛SpringBoot页面时突然看到页面上新增了一个SpringAI项目,于是试了一下,感觉还行。其实就是封装了各家…

Harmony鸿蒙南向外设驱动开发-Audio

Audio驱动概述 多媒体系统是物联网设备开发中不可缺少的一部分,Audio作为其中重要的一个模块,Audio驱动模型的构建显得尤为重要。 本文主要介绍基于HDF(Hardware Driver Foundation)驱动框架开发的Audio驱动,包括Aud…

是时候开启Copilot下一篇章:Microsoft AI

微软总裁兼首席执行官萨提亚纳德拉欢迎 Mustafa Suleyman 和 Karn Simonyan 加入微软公司,领导一个新成立的部门 —— Microsoft AI,旨在开发 Copilot 和其他的面向消费者的 AI 产品和研究。 Mustafa Suleyman 将担任 Microsoft AI 执行副总裁&#xf…

基于单片机的智能居家火灾报警系统

摘要:采用STC15L2K32单片机设计了一种智能火灾报警系统,它是控制中心与多个不同功能的探测模块构成,实现了一个中心、多点辐射的火灾检测和报警功能。 关键词:智能居家,火灾报警系统,单片机,模块化设计。 0 引言 近些年电子技术、计算机技术为火灾报警系统和灭火系统在…

idea keymap用eclipse的相关快捷键

idea快捷键用eclipse的方式 CtrlShiftR 搜索文件 shiftshift 全部文件/类搜索 CtrlH 全局搜索 CtrlO 快速打开Outline大纲视图 ctrle 查看recent窗口文件 ctrlt 快速进入接口的实现类 ctrlshiftf 格式化代码 altshiftr 变量或函数的重命名 ctrlshifto 移除无用的头文…

YOLOv8绝缘子边缘破损检测系统(可以从图片、视频和摄像头三种方式检测)

可检测图片和视频当中出现的绝缘子和绝缘子边缘是否出现破损,以及自动开启摄像头,进行绝缘子检测。基于最新的YOLO-v8训练的绝缘子检测模型和完整的python代码以及绝缘子的训练数据,下载后即可运行。(效果视频:YOLOv8绝…

C# WinForm —— 项目目录结构

1. WinForm 应用程序项目 Properties:属性文件夹存放了一个自动生成的类文件AssemblyInfo.cs,保存了一些应用程序集的一些信息引用存放了一些为应用程序提供所需的,某些功能的一些程序集(dll文件)等添加引用&#xff…

MindOpt APL向量化建模语法的介绍与应用(2)

前言 在数据科学、工程优化和其他科学计算领域中,向量和矩阵的运算是核心组成部分。MAPL作为一种数学规划语言,为这些领域的专业人员提供了强大的工具,通过向量式和矩阵式变量声明以及丰富的内置数学运算支持,大大简化了数学建模…

vue-pdf只显示一页问题解决

<template><pdf src""></pdf> </template> <script>import pdf from vue-pdfexprot default {component: {pdf}} </script> 这个时候&#xff0c;多页的PDF只会显示第一页&#xff0c;这时各位可以去查看一下vue-pdf的源码&…

PHP发票查验接口未返回正确信息的原因、发票ocr识别接口

发票查验接口未返回正确信息的原因一般有以下几种&#xff0c;第一种可能是接口没有调通&#xff0c;第二种是本身这张发票就是一张错票、假票&#xff0c;第三种可能是税局系统或者网络问题等等。那么&#xff0c;遇到这种情况应该如何解决呢&#xff1f;翔云发票查验接口&…

Centos7 搭建Mongodb 分片集群4.0/ PSA(三成员副本集)

MongoDB 简介:1、优点和缺点:2、MongoDB适用的业务场景:Centos7 搭建Mongodb 分片集群一、安装MongoDB社区版4.01、配置程序包管理系统(`yum`)2、安装对应版本的MongoDB软件包。3、创建运行mongodb的目录并禁用SELinux4、修改文件打开数5、初始化系统5.1、创建config配置…

Docker 学习笔记(七):介绍 Dockerfile 相关知识,使用 Dockerfile 构建自己的 centos 镜像

一、前言 记录时间 [2024-4-12] 系列文章简摘&#xff1a; Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&#xff08;Centos7下安装docker、环境配置&#xff0c;以及镜像简单使用&#xff09; Docker 学习笔记&#xff08;三&#xff09;&#x…

C++ this指针的使用与详解

在C编程中&#xff0c;类和对象是核心概念。当我们定义一个类并且创建它的对象时&#xff0c;每个对象都有自己的成员变量和成员函数。那么&#xff0c;如何让这些成员函数能够访问对象自身的成员变量呢&#xff1f;这就需要引入一个特殊的指针——this指针。 this指针的概念 …

【数据结构(五)】栈

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.概念3.栈的使用4.栈的应用场景4.1有效的括号4.2逆波兰表达式4.3栈的压入弹…

es6对于变量的解构赋值(数组解构,对象解构,字符串解构,函数解构等)解析(2024-04-12)

1、数组的解构赋值 [ ] 1.1 数组解构的基本用法 ES6 允许按照一定模式&#xff0c;从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构&#xff08;Destructuring&#xff09;。本质上叫模型匹配&#xff0c;等号两边的模型相同就可以对应上。 //以前…

VUE_H5页面跳转第三方地图导航,兼容微信浏览器

当前项目是uniapp项目&#xff0c;若不是需要替换uni.showActionSheet选择api onMap(address , organName , longitude 0, latitude 0){var ua navigator.userAgent.toLowerCase();var isWeixin ua.indexOf(micromessenger) ! -1;if(isWeixin) {const mapUrl_tx "…

synchronized的优化策略

synchronized的优化策略 一:synchronized 的"自适应"1.1:偏向锁 二:锁消除三:锁粗化 一:synchronized 的"自适应" 锁升级的过程: (1)未加锁的状态(无锁) 当代码中开始调用执行synchronized (2)偏向锁 遇到锁冲突 (3)轻量级锁 冲突进一步提升 (4)重量级锁 …

【示例】MySQL-事务控制示例:账户转账-savepoint关键字

前言 本文讲述MySQL中的事务&#xff0c;以账户转账为例&#xff0c;体会事务的概念&#xff0c;并讲解事务相关的一个关键字用法&#xff1a;savepoint 示例 数据准备 drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment ID,n…