Golang - 备忘录模式(Memento Pattern)
备忘录模式Memento Pattern1. 知识点总结备忘录模式是一种行为型设计模式核心思想是在不破坏对象封装性的前提下捕获对象的内部状态并保存在外部以便后续能够将对象恢复到之前的状态。它最常见的应用就是**撤销Undo/重做Redo**功能比如文本编辑器、游戏存档、数据库事务回滚等。模式中有三个核心角色角色职责Originator发起人拥有需要保存的状态提供创建备忘录和恢复状态的方法Memento备忘录封装 Originator 的内部状态对外隐藏细节Caretaker管理者负责保存和恢复备忘录不直接操作备忘录内容适用场景需要实现撤销/重做功能需要保存对象的历史快照支持回滚事务执行失败时需要还原到执行前的状态。优缺点优点缺点不破坏封装性外部无法随意修改备忘录状态频繁保存大对象会消耗较多内存状态保存逻辑与业务逻辑分离管理者需要维护备忘录集合可能引入额外复杂度容易实现多步撤销/重做需要谨慎处理深拷贝与浅拷贝问题2. 示例代码下面用一个简单的文本编辑器来演示每次写入后保存快照误操作后可以通过历史栈撤销。packagemainimportfmt// Editor 是发起人Originator拥有需要被保存的内部状态。typeEditorstruct{contentstring}func(e*Editor)Write(textstring){e.contenttext}func(e*Editor)Content()string{returne.content}// Save 创建一份备忘录封装当前内容。func(e*Editor)Save()Memento{returnMemento{snapshot:e.content}}// Restore 根据备忘录恢复状态。func(e*Editor)Restore(m Memento){e.contentm.snapshot}// Memento 是备忘录只暴露给 Caretaker 和 Originator 使用。// 这里通过未导出字段限制外部直接修改快照内容。typeMementostruct{snapshotstring}// History 是管理者Caretaker负责维护备忘录的历史栈。typeHistorystruct{stack[]Memento}func(h*History)Save(m Memento){h.stackappend(h.stack,m)}func(h*History)Undo()(Memento,bool){iflen(h.stack)0{returnMemento{},false}last:h.stack[len(h.stack)-1]h.stackh.stack[:len(h.stack)-1]returnlast,true}funcmain(){editor:Editor{}history:History{}editor.Write(Hello )history.Save(editor.Save())fmt.Printf(写入后: %q\n,editor.Content())editor.Write(World!)history.Save(editor.Save())fmt.Printf(再次写入后: %q\n,editor.Content())editor.Write( 这是多余内容)fmt.Printf(误操作后: %q\n,editor.Content())ifm,ok:history.Undo();ok{editor.Restore(m)fmt.Printf(撤销一次后: %q\n,editor.Content())}ifm,ok:history.Undo();ok{editor.Restore(m)fmt.Printf(再撤销一次后: %q\n,editor.Content())}}3. 运行结果写入后: Hello 再次写入后: Hello World! 误操作后: Hello World! 这是多余内容 撤销一次后: Hello World! 再撤销一次后: Hello 4. 关键点复盘封装性是第一原则备忘录的snapshot字段没有导出外部包括 Caretaker不能直接修改快照内容只能通过 Originator 的Save/Restore来操作。Caretaker 只负责保管History不知道备忘录里具体存了什么也不应该去解析它这样 Originator 的内部结构变化不会影响历史管理逻辑。栈是实现撤销的常用结构每次保存时入栈撤销时出栈并恢复如果要支持重做可以再加一个 redo 栈。注意深拷贝如果 Originator 的状态包含引用类型切片、Map、指针保存备忘录时需要进行深拷贝否则快照会被后续修改污染。与命令模式的区别备忘录模式通过保存状态快照来撤销命令模式通常通过记录逆操作来撤销。状态简单时用备忘录更直接操作复杂时命令模式更灵活。

相关新闻

Flutter应用版本逆向分析:从APK/IPA中提取Flutter SDK版本号的实战指南

Flutter应用版本逆向分析:从APK/IPA中提取Flutter SDK版本号的实战指南

1. 从一次逆向分析的需求说起最近在做一个竞品分析,目标应用是一个基于 Flutter 开发的金融类 APP。我的任务不仅仅是看它的功能,更想了解它底层使用的技术栈,特别是 Flutter 的版本。为什么关心这个?因为 Flutter 的版本直接决定…

2026/8/7 4:55:27 阅读更多 →
Unity WebGL发布避坑指南:从内存管理到字体渲染的实战解决方案

Unity WebGL发布避坑指南:从内存管理到字体渲染的实战解决方案

1. 项目概述:为什么Unity WebGL发布是个“技术深坑”?如果你是一名Unity开发者,并且尝试过将项目发布到WebGL平台,那么“坑”这个字,你大概率深有体会。这绝不是一个简单的“文件另存为”操作。从满怀期待地点击“Buil…

2026/8/7 4:55:06 阅读更多 →
Web3D 轻量化定制工具落地民用场景:全屋收纳隔断在线可视化设计方案实践-井小然收纳案例

Web3D 轻量化定制工具落地民用场景:全屋收纳隔断在线可视化设计方案实践-井小然收纳案例

摘要 传统定制收纳存在门槛高、尺寸匹配差、设计效果不可视等痛点,专业 CAD 软件学习成本高,普通用户难以快速完成抽屉、衣柜、厨卫收纳隔板建模。本文结合 WebGL/Three.js 网页三维可视化技术,介绍一款面向普通用户的轻量化在线 3D 定制工具…

2026/8/5 23:53:03 阅读更多 →

最新新闻

大数据技术栈入门指南:从Hadoop到Flink的生态系统全景解析

大数据技术栈入门指南:从Hadoop到Flink的生态系统全景解析

1. 从“数据孤岛”到“数据海洋”:为什么我们需要大数据技术栈?如果你在最近几年从事过任何与技术、产品、运营甚至市场相关的工作,大概率会听到过“大数据”这个词。它可能出现在老板的年度规划里,出现在技术团队的招聘需求上&am…

2026/8/7 4:55:49 阅读更多 →
WeNet端到端语音识别实战:从理论到工业部署

WeNet端到端语音识别实战:从理论到工业部署

1. 项目概述:WeNet语音识别实战课程解析作为一名在语音识别领域摸爬滚打多年的工程师,我见证了这个领域从传统GMM-HMM到端到端深度学习的革命性转变。最近在慕课平台开设的《WeNet语音识别实战》课程,正是基于当前最前沿的端到端语音识别框架…

2026/8/7 4:55:49 阅读更多 →
Spring Boot过滤器与拦截器:核心机制、应用场景与最佳实践

Spring Boot过滤器与拦截器:核心机制、应用场景与最佳实践

1. 从一次线上故障说起:为什么我们需要“门卫”和“安检员”那天下午,监控系统突然告警,某个核心接口的响应时间从平时的50毫秒飙升到了5秒以上,紧接着错误率也开始攀升。登录服务器一看,日志里充斥着大量来自同一个IP…

2026/8/7 4:55:49 阅读更多 →
SQL Server AlwaysOn可用性组:从零搭建高可用数据库集群实战指南

SQL Server AlwaysOn可用性组:从零搭建高可用数据库集群实战指南

1. 项目概述:为什么我们需要AlwaysOn?在数据库运维的日常里,最怕听到的不是“性能有点慢”,而是“数据库挂了”。对于像SQL Server这样承载核心业务数据的系统,停机往往意味着业务中断、数据丢失和真金白银的损失。传统…

2026/8/7 4:55:49 阅读更多 →
大模型智能体(Agent)核心架构、实战选型与从零构建指南

大模型智能体(Agent)核心架构、实战选型与从零构建指南

1. 项目概述:拨开Agent概念的迷雾最近和几个刚入行的朋友聊天,发现大家一提到“Agent”,表情就变得有点微妙。有人觉得这是通往AGI(通用人工智能)的圣杯,必须立刻投入学习;也有人被各种框架、论…

2026/8/7 4:55:49 阅读更多 →
Python机器学习实战:从零搭建完整项目流程与核心算法应用

Python机器学习实战:从零搭建完整项目流程与核心算法应用

想学机器学习,但面对铺天盖地的“从入门到精通”课程,你是不是总在犹豫:这些课程真的能让我从零开始,做出实际项目吗?还是说,学完只是记住了几个算法名字,面对真实数据依然无从下手?…

2026/8/7 4:54:48 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →