[整理] 设计模式之备忘录模式
概述
备忘录模式(Memento [mə'mentəʊ] ):
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
应用场合
- 必须保存一个对象在某一时刻(部分)的状态,这样以后需要时它才能恢复到先前的状态。
- 如果用一个接口来让其他对象直接得到这个状态,将会暴露对象的实现细节并破坏对象的封装性。
类图
代码结构实例
1. 创建一个备忘录类
/// <summary>
/// 备忘录类
/// </summary>
class Memento
{
private string _state;
public Memento(string state)
{
this._state = state;
}
public string State
{
get { return _state; }
}
}
2. 发起人类
Originator [ə'rɪdʒə.neɪtə]
/// <summary>
/// 发起人类
/// </summary>
class Originator
{
/// <summary>
/// 需要保存的属性
/// </summary>
private string state;
public string State
{
get { return state; }
set { state = value; }
}
/// <summary>
/// 创建备忘录,将当前需要保存的信息导入并实例化一个Memento对象
/// </summary>
/// <returns></returns>
public Memento CreateMemento()
{
return (new Memento((state)));
}
/// <summary>
/// 恢复备忘录模式,将Memento导入并将相关数据恢复
/// </summary>
/// <param name="memento"></param>
public void SetMemento(Memento memento)
{
state = memento.State;
}
/// <summary>
/// 显示状态
/// </summary>
public void Show()
{
Console.WriteLine("State="+state);
}
}
3. 管理者类
Caretaker ['keə.teɪkə]
/// <summary>
/// 管理者类
/// </summary>
class Caretaker
{
/// <summary>
/// 得到备忘录
/// </summary>
private Memento memento;
public Memento Memento
{
get { return memento; }
set { memento = value; }
}
}
4. 客户端调用
/// <summary>
/// 测试备忘录模式
/// </summary>
static void TestMemento()
{
Originator o = new Originator();
o.State = "On"; //初始状态
o.Show();
Caretaker c = new Caretaker();
c.Memento = o.CreateMemento();//保存状态
o.State = "Off";//状态改变为Off
o.Show();
o.SetMemento(c.Memento);//恢复原始状态
o.Show();
Console.Read();
}
小结
备忘录模式好像大部分在游戏程序设计里使用,来保存游戏状态
附记:在茫茫的信息海洋中,遇到就是有缘,期待回复交流,为缘分留下痕迹……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下