C#设计模式(行为型模式):备忘录模式,时光倒流的魔法
C#设计模式:备忘录模式,时光倒流的魔法
在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如:
- 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。
- 事务回滚: 数据库操作失败时,回滚到之前的状态。
- 游戏存档: 保存游戏进度,方便下次继续游戏。
为了实现这些功能,我们可以使用备忘录模式(Memento Pattern),它提供了一种在不破坏封装性的前提下,捕获并外部化对象的内部状态,以便以后可以将对象恢复到原先保存的状态。
一、备忘录模式简介
备忘录模式属于行为型设计模式,它主要解决的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象到原先保存的状态。
二、备忘录模式的结构
备忘录模式包含三个角色:
- Originator(原发器): 需要保存状态的对象。
- Memento(备忘录): 存储原发器内部状态的对象。
- Caretaker(管理者): 负责保存备忘录,但不能对备忘录的内容进行操作或检查。
三、C# 实现示例
让我们通过一个简单的文本编辑器示例来理解备忘录模式:
// 原发器:文本编辑器
class TextEditor
{private string _text;public string Text{get { return _text; }set { _text = value; }}// 创建备忘录public TextMemento CreateMemento(){return new TextMemento(_text);}// 恢复备忘录public void RestoreMemento(TextMemento memento){_text = memento.GetSavedText();}
}// 备忘录:保存文本编辑器的状态
class TextMemento
{private readonly string _text;public TextMemento(string text){_text = text;}public string GetSavedText(){return _text;}
}// 管理者:负责保存和恢复备忘录
class History
{private Stack<TextMemento> _mementos = new Stack<TextMemento>();public void Save(TextEditor editor){_mementos.Push(editor.CreateMemento());}public void Undo(TextEditor editor){if (_mementos.Count > 0){editor.RestoreMemento(_mementos.Pop());}}
}// 客户端代码
class Program
{static void Main(string[] args){TextEditor editor = new TextEditor();History history = new History();editor.Text = "First line";history.Save(editor); // 保存状态editor.Text = "Second line";history.Save(editor); // 保存状态editor.Text = "Third line";Console.WriteLine(editor.Text); // 输出: Third linehistory.Undo(editor); // 撤销Console.WriteLine(editor.Text); // 输出: Second linehistory.Undo(editor); // 撤销Console.WriteLine(editor.Text); // 输出: First line}
}
四、备忘录模式的优缺点
优点:
- 封装性好: 备忘录模式将对象的状态封装在备忘录对象中,外部无法直接访问,保证了对象的封装性。
- 易于扩展: 可以方便地增加新的备忘录类来保存不同的对象状态。
- 简化原发器: 将状态保存和恢复的逻辑分离到备忘录类中,简化了原发器的代码。
缺点:
- 资源消耗: 如果需要保存的对象状态很大,或者需要保存很多次状态,会消耗大量的内存资源。
- 增加代码复杂度: 引入了新的类,增加了代码的复杂度。
五、总结
备忘录模式提供了一种优雅的方式来保存和恢复对象的状态,它在需要实现撤销、回滚、存档等功能时非常有用。但是,在使用备忘录模式时,也需要考虑其潜在的资源消耗和代码复杂度问题。
希望这篇博客能帮助你更好地理解和使用备忘录模式!
相关文章:
C#设计模式(行为型模式):备忘录模式,时光倒流的魔法
C#设计模式:备忘录模式,时光倒流的魔法 在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如: 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。事务回滚&am…...
数据库高安全—角色权限:权限管理权限检查
目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限:角色创建角色管理,从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍,本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...
FastAPI 的依赖注入与生命周期管理深度解析
FastAPI 的依赖注入与生命周期管理深度解析 目录 🔧 依赖注入与 FastAPI 高级特性 1.1 依赖注入的基础与核心概念1.2 FastAPI 的依赖注入机制与设计理念1.3 FastAPI 依赖注入的异步特性 🕹 生命周期与依赖的异步管理 2.1 依赖的生命周期管理࿱…...
【express-generator】05-路由中间件和错误处理(第一阶段收尾)
一、前言 上篇文章我们介绍了express-generator的请求体解析,重点讲了常用的请求体数据格式(JSON/URL 编码的表单数据)以及一个FILE文件上传,同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识,…...
Linux环境下确认并操作 Git 仓库
在软件开发和版本控制中,Git 已成为不可或缺的工具。有时,我们需要确认某个目录是否是一个 Git 仓库,并在该目录中运行脚本。本文将详细介绍如何确认 /usr/local/src/zcxt/backend/policy-system-backend 目录是否是一个 Git 仓库,…...
UDP -- 简易聊天室
目录 gitee(内有详细代码) 图解 MessageRoute.hpp UdpClient.hpp UdpServer.hpp Main.hpp 运行结果(本地通信) 如何分开对话显示? gitee(内有详细代码) chat_room zihuixie/Linux_Lear…...
NVIDIA在CES 2025上的三大亮点:AI芯片、机器人与自动驾驶、全新游戏显卡
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜
AI的两次寒冬:从感知机困局到深度学习前夜 引用(中英双语) 中文: “第一次AI寒冬,是因为感知机局限性被揭示,让人们失去了对算法可行性的信心。” “第二次AI寒冬,则是因为专家系统的局限性和硬…...
transformer深度学习实战CCTSDB中国交通标志识别
本文采用RT-DETR作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。RT-DETR以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对CCTSDB交通标志数据集进行训练和优化,该数据集包含丰富的CCTSDB交…...
JavaWeb开发(六)XML介绍
1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。 (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。 (3&a…...
使用pbootcms开发一个企业官网
V:llike620 pbootcms开源PHP建站系统 https://www.pbootcms.com/ 配置网站 域名解析后,网站绑定到程序根目录即可 例如:本地域名是dobot.test ,那么也要同步本地的hosts是 127.0.0.1 dobot.test 需要配置下伪静态规则 location / {if (!-e $r…...
Linux C编程——文件IO基础
文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(人民医院的信息系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划风险管理2、项目风险识别3、风险定性分析4、风险定量分析5、制定风险应对6、实施风险应对计划7、监督风险论文 2022年6月,我作为项目经理承担了XX县人民医院的信息系统建设,该项目总投资300万,其…...
UE播放声音
蓝图中有两个播放声音的函数 Play Sound 2D 和 Play Sound at Location Play Sound 2D没有声音距离衰减,一般用于界面ui Play Sound at Location 有声音距离衰减,一般用于枪声,场景声等,比较常用...
Docker Compose 启动 Harbor 并指定网络
1. 介绍 Harbor 是一个开源的企业级 Docker 镜像仓库,提供镜像存储、访问控制、安全扫描等功能。使用 Docker Compose 启动 Harbor 时,您可以指定一个自定义网络,以便管理容器之间的网络通信。在本示例中,我们将创建一个名为 har…...
WebSocket 实战案例:从设计到部署
在前六篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发、客户端实现、安全实践、性能优化和测试调试。今天,让我们通过一个实战案例,看看如何将这些知识应用到实际项目中。我曾在一个大型在线教育平台中,通过 WebSocket 实现了实时互动课堂,支持了数万名师生的同时在…...
selenium合集
环境搭建步骤 安装selenium pip install selenium 安装浏览器 安装浏览器驱动 谷歌浏览器:chromdriver.exe ie浏览器:ieserverdriver.exe FireFox浏览器:geckodriver.exe 特别注意⚠️:下载驱动版本必须与浏览器版本一致 下载地址 淘宝镜像࿱…...
JVM生产环境常用参数配置及调优建议
一、生产常用参数配置 JAVA_OPTS"-server -Xms3000m -Xmx3000m -Xmn1500m -XX:UseG1GC -XX:ConcGCThreads8 -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:./g1-gc.log -XX:MaxMetaspaceSize256m -XX:-UseGCOverheadLimit -XX:UseCompressedOops -XX:HeapDumpOnOu…...
Spring Boot 3 实现 MySQL 主从数据库之间的数据同步
✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现…...
【小程序开发】- 小程序版本迭代指南(版本发布教程)
一,版本号 版本号是小程序版本的标识,通常由一系列数字组成,如 1.0.0、1.1.0 等。版本号的格式通常是 主版本号.次版本号.修订号 主版本号:当小程序有重大更新或不兼容的更改时,主版本号会增加。 次版本号:…...
源荷储再创新!小论文轻松发!基于雨流计数法的源-荷-储双层协同优化配置研究Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
Gemma-3-12b-itGPU算力适配指南:A100/H100/A800多卡并行配置参数详解
Gemma-3-12b-it GPU算力适配指南:A100/H100/A800多卡并行配置参数详解 1. 项目背景与核心价值 Gemma-3-12b-it是基于Google最新大模型架构开发的多模态交互工具,专为需要本地部署大模型的企业和研究机构设计。12B参数规模的模型在图文理解和生成任务上…...
别再手动写矩阵了!用Eigen库提升你的C++数值计算效率(性能对比实测)
别再手动写矩阵了!用Eigen库提升你的C数值计算效率(性能对比实测) 在科学计算和工程仿真领域,矩阵运算如同空气般无处不在。从计算机视觉中的三维重建到金融工程里的蒙特卡洛模拟,开发者们每天都在与各种规模的矩阵打交…...
在超大数据集下 DuckDB 与 MySQL 查询速度对比嵌
一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...
HTML是Web开发的基石,掌握HTML是构建网页的第一步
HTML是Web开发的基石,掌握HTML是构建网页的第一步。 HTML简介 HTML(HyperText Markup Language)超文本标记语言: 不是编程语言,是标记语言 使用标签描述网页结构 浏览器解析HTML显示网页 基本结构 <!DOCTYPE html> <html> <head><...
华为服务器SP380网卡固件升级保姆级教程(附避坑指南)
华为SP380网卡固件升级全流程实战手册 当数据中心运维团队遇到网络性能瓶颈或安全漏洞时,网卡固件升级往往是最经济高效的解决方案。作为华为服务器搭载的高性能网卡,SP380在企业级环境中承担着关键的网络流量处理任务。本文将深入解析通过Smart Provisi…...
SteamCleaner游戏空间清理完整指南:快速释放硬盘空间的终极解决方案
SteamCleaner游戏空间清理完整指南:快速释放硬盘空间的终极解决方案 【免费下载链接】SteamCleaner :us: A PC utility for restoring disk space from various game clients like Origin, Steam, Uplay, Battle.net, GoG and Nexon :us: 项目地址: https://gitco…...
DOM-to-Image:前端开发中的DOM渲染到图像转换技术深度解析
DOM-to-Image:前端开发中的DOM渲染到图像转换技术深度解析 【免费下载链接】dom-to-image Generates an image from a DOM node using HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/do/dom-to-image 在当今Web应用开发中,将动态DOM内容…...
SQL表连接终于讲明白了:INNER JOIN、LEFT JOIN、RIGHT JOIN 一次学透
SQL表连接终于讲明白了:INNER JOIN、LEFT JOIN、RIGHT JOIN 一次学透 很多人学 SQL,卡得最久的不是 SELECT、WHERE,而是表连接(JOIN)。这篇就不绕弯,直接把 SQL 表连接讲到能上手。 一、为什么一定要学会表…...
云原生应用开发最佳实践:构建现代化的云原生系统
云原生应用开发最佳实践:构建现代化的云原生系统 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知云原生应用开发在现代企业中的重要性。随着云技术的快速发展,传统的应用开发方式已经难以满足需求。今天,我就来聊聊云原…...
