尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Go设计模式入门指南:命令与备忘录模式详解,2种方法实现撤销操作与状态快照
Go设计模式入门指南命令与备忘录模式详解2种方法实现撤销操作与状态快照【免费下载链接】go-patternsDesign patterns for the Go programming language项目地址: https://gitcode.com/gh_mirrors/gopat/go-patternsgo-patterns 是一个面向 Go 语言的设计模式示例库按创建型、结构型、行为型三大类组织经典设计模式的完整实现。本文聚焦其behavioral包中的两个行为型模式——命令模式Command与备忘录模式Memento带你用这两种方法实现撤销操作与状态快照为你的 Go 程序加上一颗后悔药 设计模式就像拼图每一块各司其职拼在一起才构成完整的程序命令模式入门把请求封装成对象命令模式的核心思想一句话概括把请求封装成对象。这样一来发送请求的一方和执行请求的一方就解耦了还能顺便支持请求排队、日志记录和可撤销操作。在 go-patterns 中命令模式的实现在 behavioral/command.go结构非常简洁角色类型职责接收者Person持有要执行的方法负责真正干活命令Command封装对谁执行哪个方法提供Execute()入口核心代码只有寥寥几行// Command is a command which when executed on a person will call a given method. type Command struct { person *Person method func() } // Execute executes the command. func (c *Command) Execute() { c.method() }配合Person上的Talk()、PassOn()、Gossip()等方法每个方法在执行完自己的动作后会调用身上携带的下一个命令。这样就自然形成了一条执行链。官方测试用例 behavioral/command_test.go 演示了完整效果Fred is talking. Barney is passing on. Betty is gossiping. Wilma is listening.Fred 一开口请求就像接力棒一样依次传递给 Barney、Betty最后由 Wilma 收住。这个例子正好体现了命令模式参数化不同请求的威力——Person只管执行命令完全不关心具体是谁在做什么。方法 1用命令模式实现撤销操作命令模式天然是动作的载体。要实现撤销只需给命令加上一对正操作 / 逆操作type UndoableCommand struct { do func() undo func() } func (c *UndoableCommand) Execute() { c.do() } func (c *UndoableCommand) Undo() { c.undo() }执行时把命令压入一个切片撤销时弹出最后一个命令并调用Undo()即可——这就是编辑器里 CtrlZ 的基本原理。✅ 适合场景动作天然可逆的操作比如新增订单 → 删除订单、转账 → 反向转账。⚠️ 注意前提是每个操作都能写出一条明确的逆操作否则这条路走不通。备忘录模式入门给状态拍快照备忘录模式Memento的思路完全不同不关心做了什么动作而是直接给对象内部状态拍照需要时再把状态还原回去且全程不破坏封装性。go-patterns 中的实现在 behavioral/memento.go用一个整数Number演示了完整流程// Memento stores the state of the Number. type Memento struct { state int } // CreateMemento creates a Memento with the current state of the number. func (n *Number) CreateMemento() *Memento { return NewMemento(n.value) } // ReinstateMemento reinstates the value of the Number to the value of the memento. func (n *Number) ReinstateMemento(memento *Memento) { n.value memento.state }官方测试 behavioral/memento_test.go 演示了状态如何被冻结再复活n : NewNumber(10) n.Dubble() // 10 → 20 memento : n.CreateMemento() // 拍快照定格 20 n.Half() // 20 → 10 n.ReinstateMemento(memento) // 还原10 → 20 ✅方法 2用备忘录模式实现撤销操作把每次操作前的快照压入栈中撤销就是取出上一张快照并还原var history []*Memento func operate(n *Number) { history append(history, n.CreateMemento()) // ... 执行业务操作 ... } func undo(n *Number) { m : history[len(history)-1] history history[:len(history)-1] n.ReinstateMemento(m) }✅ 适合场景操作复杂难以写出逆操作、状态需要完整回滚的场景比如编辑器撤销、草稿保存/恢复、数据库事务回滚。⚠️ 注意快照会占用内存状态越大代价越高必要时只保存脏字段。命令模式 vs 备忘录模式2种方法对比对比维度命令模式备忘录模式关注点请求/动作本身对象状态撤销原理执行逆操作undo 方法还原状态快照实现前提每个操作可写出逆操作状态可完整复制主要开销维护 do/undo 方法对快照的内存占用典型应用按钮事件、任务队列、订单取消编辑器撤销、草稿恢复简单说知道怎么反着做就用命令模式状态复杂就靠备忘录模式拍快照。两者也可以组合使用——命令负责调度动作备忘录负责兜底回滚 项目代码位置本文涉及的源码均位于 go-patterns 仓库的behavioral包中包说明见 behavioral/doc.go命令模式实现behavioral/command.go命令模式测试四人接力示例behavioral/command_test.go备忘录模式实现behavioral/memento.go备忘录模式测试快照还原示例behavioral/memento_test.go全部模式清单与说明README.md小结 本文基于 go-patterns 项目的行为型模式实现介绍了实现撤销操作与状态快照的两种经典方法命令模式——把请求封装成对象为每个动作准备逆操作备忘录模式——给状态拍快照需要时一键还原。理解这两块拼图你就能轻松为自己的 Go 应用加上 undo/redo 能力。如果想继续补齐整副拼图不妨通读项目中的creational、structural两个包掌握完整的 Go 设计模式版图。【免费下载链接】go-patternsDesign patterns for the Go programming language项目地址: https://gitcode.com/gh_mirrors/gopat/go-patterns创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

让CIDER/Cursive告别纯文本输出:3步用nrepl中间件接入Reveal可视化调试

让CIDER/Cursive告别纯文本输出:3步用nrepl中间件接入Reveal可视化调试

让CIDER/Cursive告别纯文本输出:3步用nrepl中间件接入Reveal可视化调试 【免费下载链接】reveal Read Eval Visualize Loop for Clojure 项目地址: https://gitcode.com/gh_mirrors/rev/reveal Reveal 是专为 Clojure 打造的可视化调试工具(Read …

📅 2026/11/2 0:44:27
亚马逊卖家图片翻译提速实战指南2026年8月

亚马逊卖家图片翻译提速实战指南2026年8月

亚马逊卖家图片翻译提速实战指南2026年8月每年旺季备货季,亚马逊卖家的Listing上线时间往往被图片处理卡住。一批新品需要准备50到200张商品图,每张图都要翻译文字、调整排版、替换背景。人工操作耗时耗力,稍有不慎还会影响转化率。跨境卖家急…

📅 2026/11/2 8:32:27
BundlerMinifier 源码揭秘:C 如何复刻 node.js Minimatch 的 Glob 匹配引擎

BundlerMinifier 源码揭秘:C 如何复刻 node.js Minimatch 的 Glob 匹配引擎

BundlerMinifier 源码揭秘:C# 如何复刻 node.js Minimatch 的 Glob 匹配引擎 【免费下载链接】BundlerMinifier Visual Studio extension 项目地址: https://gitcode.com/gh_mirrors/bu/BundlerMinifier BundlerMinifier 是一款 Visual Studio 文件打包与压缩…

📅 2026/11/5 11:08:48
MORE NEWS

更多资讯

📰

日本换电工证在哪里换 全流程办理指南 全国通用怎么办理

日本换电工证在哪里换 全流程办理指南 全国通用怎么办理 之前考的证在外省能不能转过来?这个问题很多在外地工作的朋友都问过,特别是像我们在洛阳涧西区的中小施工企业负责人,经常因为项目跨省作业,遇到证书使用受限的麻烦。好消息是,我国的特种作业操…

📰

松原哪有办电工证的保姆级教程:急需特种作业证才能上岗找工作

松原哪有办电工证的保姆级教程:急需特种作业证才能上岗找工作 你是不是正盯着手机屏幕,心里想着: 松原哪有办电工证的 ?别急,我懂你。现在找工作,没有电工证,连面试资格都没有。特种作业证,不仅是门槛,更是你进入这个行业的“入场券”。如果你正在…

📰

卓资电工证报名避坑指南:考前押题帮你少走弯路

卓资电工证报名避坑指南:考前押题帮你少走弯路 你是不是也遇到过这种情况?手里拿着电工证,却不知道去哪报名?怕被中介骗钱?怕跑错地方浪费时间?别急,今天就给你讲清楚【卓资电工证】的报考全流程,特别是考前押题怎么用,让你少花冤枉钱、少走冤枉路。…

📰

考电工证都有什么题培训机构怎么选

电工证考试都考啥题?上岗必备干货全在这儿 实操考试心里没底怕挂科,这可能是你眼下最真实、最急迫的担忧。电工证不仅是上岗必备的通行证,更直接影响你能否顺利进入工地、工厂、维修站点等作业现场。但很多人对考试内容一知半解,特别是面对实操考核时,更…

📰

中级电工证考试多少天官方回应怕考不过白交培训费

中级电工证考试多少天官方回应怕考不过白交培训费 怕考不过白交培训费?中级电工证考试多少天?官方回应来了,这波操作你必须知道。别让高价培训费打水漂,看完这篇,你就能知道如何科学备考、精准拿证。 为什么中级电工证这么重要?…

📰

电工证怎样留抵多久拿证怕考不过白交培训费

电工证怎样留抵多久拿证怕考不过白交培训费 怕考不过白交培训费?电工证怎样留抵,多久拿证?这些问题可能是你最关心的。特别是对于周口地区转岗的从业者来说,拿到电工证不仅是进入新行业的“通行证”,更是提升薪资、稳定工作的关键一步。但很多人在报名时…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬