备忘录模式(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
相关推荐
静水流深_沧海一粟10 小时前
04 | 别再写几十个参数的构造函数了——建造者模式StarkCoder10 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命阿星AI工作室17 小时前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)Scout-leaf3 天前
WPF新手村教程(三)—— 路由事件用户298698530143 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版mudtools4 天前
搭建一套.net下能落地的飞书考勤系统玩泥巴的4 天前
搭建一套.net下能落地的飞书考勤系统唐宋元明清21884 天前
.NET 本地Db数据库-技术方案选型郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析