拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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、指针保存备忘录时需要进行深拷贝否则快照会被后续修改污染。与命令模式的区别备忘录模式通过保存状态快照来撤销命令模式通常通过记录逆操作来撤销。状态简单时用备忘录更直接操作复杂时命令模式更灵活。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门