C#设计模式系列:备忘录模式(Memento)
1、备忘录模式简介
1.1>、定义
备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
1.2>、使用频率
低
2、备忘录模式结构
2.1>、结构图
2.2>、参与者
备忘录模式参与者:
◊ Memento
° 为创建对象的各个部件指定抽象接口
° 防止Originator意外的其他对象访问备忘录。备忘录实际上有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个Originator访问本备忘录的内部状态。
◊ Originator
° 创建一个备忘录,记录当前时刻的内部状态。
° 使用备忘录恢复内部状态。
◊ Caretaker
° 负责保存备忘录
° 不能对备忘录的内容进行操作或检查
在备忘录模式中,Caretaker负责把Originator创建的Memento进行备份,当需要的时候,Originator可以再使用Caretaker中保存的Memento进行恢复,Originator中的所有状态被恢复到备份操作之前的状态。
3、备忘录模式结构实现
Memento.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.MementoDesignPattern.Structural { public class Memento { private string _state; public Memento(string state) { this._state = state; } public string State { get { return _state; } } } }
Originator.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.MementoDesignPattern.Structural { public class Originator { private string _state; public string State { get { return _state; } set { _state = value; Console.WriteLine("State = " + _state); } } public Memento CreateMemento() { return (new Memento(_state)); } public void SetMemento(Memento memento) { Console.WriteLine("Restoring state..."); State = memento.State; } } }
Caretaker.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.MementoDesignPattern.Structural { public class Caretaker { private Memento _memento; public Memento Memento { get { return _memento; } set { _memento = value; } } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DesignPatterns.MementoDesignPattern.Structural; namespace DesignPatterns.MementoDesignPattern { class Program { static void Main(string[] args) { Originator o = new Originator(); o.State = "On"; Caretaker c = new Caretaker(); c.Memento = o.CreateMemento(); o.State = "Off"; o.SetMemento(c.Memento); } } }
运行输出:
State = On State = Off Restoring state... State = On 请按任意键继续. . .
4、备忘录模式应用分析
备忘录模式适用情形:
1>、必须保存一个对象在某一个时刻的部分状态,这样以后需要时才能恢复到先前的状态。
2>、如果用一个接口来让其他对象直接得到被保存对象的内部状态,将会暴露对象的实现细节并破坏对象的封装性。
备忘录模式特点:
1>、保持封装边界。使用备忘录可以避免暴露一些只应由Originator管理却又必须存储在Originator之外的信息。该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来,从而保持了封装边界。
2>、简化Originator。在其他的保持封装性的设计中,Originator负责保持Client请求过的内部状态版本。把所存储管理的重任交给了Originator,让Client管理它们请求的状态将会简化Originator,并使得Client工作结束时无需通知Originator。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2012-04-07 ASP.NET MVC系列:UrlRouting