备忘录模式(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
相关推荐
红烧code3 小时前
【Rust GUI开发入门】编写一个本地音乐播放器(9. 制作设置面板)charlie1145141913 小时前
精读C++20设计模式——结构型设计模式:享元模式Predestination王瀞潞4 小时前
基础算法(Num012)NiKo_W4 小时前
C++ 反向迭代器模拟实现dogRuning4 小时前
基于matlab的直流电机调速系统仿真分析-一套Matlab仿真实验室4 小时前
基于Matlab实现路径规划努力也学不会java4 小时前
【Java并发】揭秘Lock体系 -- condition等待通知机制熊猫钓鱼>_>5 小时前
PySpark全面解析:大数据处理的Python利器拾忆,想起5 小时前
RabbitMQ死信交换机:消息的“流放之地“