备忘录模式(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 分钟前
Java反射之根:Class类生成机制深度剖析与最佳实践请叫我聪明鸭21 分钟前
基于 marked.js 的扩展机制,创建一个自定义的块级容器扩展,让内容渲染为<div>标签而非默认的<p>标签仍然.33 分钟前
Java---反射、枚举、lambda表达式 和 泛型进阶Zsy_05100340 分钟前
【C++】类和对象(二)Duang007_1 小时前
【万字学习总结】API设计与接口开发实战指南一叶星殇1 小时前
C# .NET 如何解决跨域(CORS)Elieal1 小时前
Java项目密码加密实现详解shhpeng1 小时前
go mod vendor命令详解Java程序员威哥1 小时前
用Java玩转机器学习:协同过滤算法实战(比Python快3倍的工程实现)GeekyGuru1 小时前
C++跨平台开发的核心挑战与应对策略