新闻中心
Golang如何使用备忘录模式保存对象状态
备忘录模式通过发起者保存状态至备忘录、管理者存储备忘录、发起者从中恢复来实现状态回滚,适用于撤销功能与快照保存。

在Go语言中,备忘录模式(Memento Pattern)用于保存和恢复对象的内部状态,同时不破坏封装性。它适用于需要实现撤销功能、快照保存或状态回滚的场景。通过将状态保存到一个“备忘录”对象中,原始对象(发起者)可以随时从备忘录中恢复之前的状态,而外部对象(管理者)只能持有备忘录,不能访问其内容。
基本结构与角色
备忘录模式通常包含三个核心角色:
- 发起者(Originator):创建备忘录来保存当前状态,并能从备忘录中恢复状态。
- 备忘录(Memento):存储发起者的内部状态,通常只提供私有字段和最小接口,防止外部直接修改。
- 管理者(Caretaker):负责保存和管理备忘录,但不关心也不访问其内容。
实现示例
以下是一个简单的文本编辑器使用备忘录模式保存历史状态的例子:
// 发起者:文本编辑器 type Editor struct { text string }
fu
nc (e *Editor) SetText(text string) {
e.text = text
}
func (e *Editor) GetText() string { return e.text }
// 创建备忘录 func (e Editor) S*e() Memento { return &Memento{text: e.text} }
// 从备忘录恢复状态 func (e Editor) Restore(m Memento) { e.text = m.text }
// 备忘录:仅保存状态,不暴露操作方法 type Memento struct { text string }
// 管理者:保存多个备忘录(如历史记录) type History struct { mementos []*Memento }
func (h History) Push(m Memento) { h.mementos = append(h.mementos, m) }
func (h History) Pop() Memento { if len(h.mementos) == 0 { return nil } index := len(h.mementos) - 1 m := h.mementos[index] h.mementos = h.mementos[:index] return m }
使用方式:
func main() { editor := &Editor{} history := &History{}editor.SetText("第一版内容")
history.Push(editor.S*e()) // 保存状态
editor.SetText("第二版内容")
history.Push(editor.S*e())
editor.SetText("第三版内容")
// 撤销一次
if m := history.Pop(); m != nil {
editor.Restore(m)
}
fmt.Println(editor.GetText()) // 输出:第二版内容}
Zyro AI Background Remover
Zyro推出的AI图片背景移除工具
145
查看详情
关键点说明
Go语言没有严格的访问控制(如private关键字),因此需通过命名约定和包隔离来实现封装。建议将Memento定义为不导出类型(小写开头),并放在独立包中,避免外部直接访问其字段。
- 若需跨包使用,可将Memento设计为接口,仅暴露必要方法,实际结构体不导出。
- 对于复杂状态,可结合encoding/gob或JSON进行序列化存储,减少内存占用。
- 注意深拷贝问题:如果状态包含指针或引用类型,保存前应做深拷贝,防止后续修改影响备忘录。
适用场景与注意事项
备忘录模式适合需要频繁撤销、重做或保存快照的功能,比如编辑器、游戏存档、事务回滚等。
- 大量状态保存可能带来内存压力,可限制历史长度或采用差量保存。
- 并发环境下需考虑同步问题,必要时加锁保护发起者或管理者状态。
- Go的简洁语法使得该模式实现轻量,无需复杂继承体系。
基本上就这些,用好这个模式能让状态管理更清晰安全。
以上就是Golang如何使用备忘录模式保存对象状态的详细内容,更多请关注其它相关文章!
# 复用
# 新沂网站推广代运营
# 平山海外网站推广方法
# 产品传播营销推广渠道
# 抚州运营营销推广代理商
# 关键词排名卖家怎么排
# 宇宙相亲网站建设游戏app
# 杭州抖音seo代理服务
# SEO优化软件分类名称
# 市场营销产品推广策划书
# 济南关键词排名运营
# 多个
# 放在
# 也不
# 是一个
# golang
# 如何实现
# 来实现
# 适用于
# 编辑器
# 如何使用
# 封装性
# 内存占用
# ai
# app
# go语言
# go
# json
# js
# 备忘录模式
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
如何在Promise链中优雅地中断后续then执行
我的世界官方游戏入口 我的世界官网平台直达链接
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
微信网页版官方入口直达 微信网页版网页版登录使用方法
新手怎么开始学化妆 零基础化妆入门教程
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
12306选座怎么选到商务座_12306商务座选择与配置说明
Node.js中HTML按钮与J*aScript函数交互的正确姿势
msn官网入口地址手机版 msn官方网站手机最新链接
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
Golang如何使用context实现超时取消_Golang context超时取消模式实践
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
Go语言HTML解析:利用Goquery精准获取指定元素内容
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
抖音怎么赚钱_抖音创作者变现方法与途径指南
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
Mac怎么查看崩溃日志_Mac控制台错误报告分析
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
Linux如何构建多环境配置管理_Linux多环境配置方案
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
从J*aScript对象中精确提取指定属性的教程
J*a递归快速排序中静态变量的状态管理与陷阱
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
红果短剧网页版官网入口 官方最新网址发布
使用Python高效删除Word宏并转换DOCM为DOCX格式
Golang如何安装Swagger工具_GoSwagger文档生成环境
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
c++20的std::jthread是什么_c++可中断线程与RAII式管理
Lar*el Excel导入时生成自定义递增ID的策略与实践
qq游戏网页版直接玩_qq游戏免下载快速入口
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
在J*a中如何使用Stream.map转换元素_Stream映射操作解析
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
Mac终端命令大全_Mac常用Terminal指令速查
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
J*aScript map 迭代中检测空数组元素的有效方法
深入理解Promise链:如何在catch后中断then的执行
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
Go语言中Map值调用指针接收器方法的限制与应对
如何在 Excel Online 和 Google 表格中更改日期格式


2025-11-16
浏览次数:次
返回列表