备忘录模式(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
相关推荐
霸道流氓气质7 分钟前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排高晶19 分钟前
ARM 嵌入式 Linux 系统 U-Boot 开发与移植实战M释厄6231 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值2601_962885721 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?临床数据科学和人工智能兴趣组1 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务蜗牛互联网2 小时前
Python调用Gemini Structured Outputs实现工单路由门禁SEO_juper2 小时前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)Wang's Blog2 小时前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读盛世宏博北京2 小时前
十二防档案库房总线架构设计:恒湿消毒净化一体机 RS485 组网实战笔记雪雪爱冲浪2 小时前
JavaScript 网络爬虫教程(2026)