备忘录模式(Memento Pattern)
概念:
· 在不破坏封装的前提下,捕获对象的内部状态,并保存该内部状态,以便可以将对象恢复到原先的状态;
· 主要解决的问题是可以保存某些时刻的状态,并在需要的时候进行回滚或撤销;
UML结构:
cs+----------------+ +----------------+ +----------------+ | Originator | | Memento | | Caretaker | +----------------+ +----------------+ +----------------+ | - state |<>------->| - state | | - mementoList | | + createMemento() | | + getState() | | + save(memento)| | + restore(memento)| | | | + undo() | +----------------+ +----------------+ +----------------+ Originator(发起人):需要保存状态的对象,负责创建备忘录(Memento),并能从备忘录恢复状态 Memento(备忘录):存储发起人的内部状态,防止被其他对象访问 Caretaker(管理者):负责保存备忘录,但不能修改备忘录的内容代码示例:
cs/// <summary> /// 备忘录类,存储文本状态 /// </summary> public class TextMemento { public string Content { get; set; } public TextMemento(string content) { Content = content; } } /// <summary> /// 创建备忘录的类 /// </summary> public class TextEditor { private TextMemento textmemento { get; set; } = new TextMemento(""); private Caretaker caretaker = new(); // 数据管理者 // 恢复备忘录 public void UndoMemento() { var memento = caretaker.Undo(); textmemento = memento ?? new TextMemento(""); } // 展示内容 public void ShowContent() { Console.WriteLine("当前文本内容: " + textmemento.Content); } public void SaveContent() { TextMemento textMemento = new TextMemento(textmemento.Content); caretaker.Save(textMemento); } public void AddContent(string content) { textmemento.Content = textmemento.Content + content; } } /// <summary> /// 备忘录数据管理者 /// </summary> public class Caretaker { private readonly List<TextMemento> _history = new(); public void Save(TextMemento memento) { _history.Add(memento); } public TextMemento Undo() { if (_history.Count == 0) return null; var memento = _history[_history.Count - 1]; _history.RemoveAt(_history.Count - 1); return memento; } } /// <summary> /// 客户端 /// </summary> public class Client { public static void Main() { TextEditor textEditor = new TextEditor(); textEditor.AddContent("第一次写"); textEditor.SaveContent(); textEditor.AddContent("第不知道几次写"); textEditor.SaveContent(); textEditor.UndoMemento(); } }特点:
优点:
· 提供状态恢复机制:
· 封装性好:外部状态无法直接访问Originator类的内部状态,只能通过Memento恢复;
· 简化Originator逻辑:状态管理交给Memento和Caretaker,职责清晰;
缺点:
· 资源开销大:保存的状态过多时会占用很多内存;
· 管理的复杂度高:如果系统需要支持多步的撤销或重做时,状态的管理会更加复杂;
适用场景:
· 需要支持 撤销/回滚 操作的场景;
· 需要保存某个对象在不同时间点的快照;
· 希望在不破坏对象封装的前提下,保存和恢复其内部状态;
举例场景:
· 文本编辑器;
· 游戏存档系统;
【设计模式】备忘录模式
大飞pkz2025-10-02 15:35
相关推荐
Zenova EdgeOS23 分钟前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链取名真是34 分钟前
Python 算法知识点从基础到进阶FRing031 小时前
vue2干货总结3(computed计算属性、watch监听器)Fatbobman(东坡肘子)2 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160揽星河..2 小时前
【C语言】底层程序设计JavaPub-rodert2 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践海的透彻3 小时前
dockerfile如何快速构建容器(java服务)code2cat3 小时前
Java工具篇之Gradle:用任务图组织构建与交付北京中科新远科技3 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试