备忘录模式是一种行为型设计模式,用于捕获对象的内部状态并在不破坏其封装性的情况下将其保存,以便稍后可以将对象恢复到先前的状态。这种模式通常用于需要撤销操作或在发生错误时恢复对象状态的情况。
原理
备忘录模式包含以下几个关键角色:
- Originator(发起人):负责创建一个备忘录对象,以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。
- Memento(备忘录):负责存储发起人的内部状态。备忘录可以有不同的实现,但通常包含了原发起人状态的部分或全部信息。
- Caretaker(负责人):负责保存备忘录对象,但不能对备忘录进行操作或检查其内容。其主要作用是防止其他对象访问备忘录,确保只有发起人可以读取备忘录中的状态。
优点
- 支持撤销操作:允许将对象恢复到之前的状态。
- 封装性好:备忘录模式将状态信息封装在备忘录对象中,使得发起人对象不需要暴露其内部状态,从而提高了封装性和安全性。
- 简化发起人:备忘录模式将存储状态的责任分离出来,使得发起人类的代码更加清晰简洁。
缺点
- 资源消耗:如果需要保存大量的状态信息,会占用较多的内存资源。
- 备忘录管理:负责人对象需要管理备忘录对象,可能会引入额外的复杂性。
C# 示例代码
using System;
// 备忘录类
class Memento
{
private string _state;
public Memento(string state)
{
_state = state;
}
public string GetState()
{
return _state;
}
}
// 发起人类
class Originator
{
private string _state;
public string State
{
get { return _state; }
set
{
Console.WriteLine("设置状态:" + value);
_state = value;
}
}
public Memento SaveStateToMemento()
{
Console.WriteLine("保存状态到备忘录");
return new Memento(_state);
}
public void GetStateFromMemento(Memento memento)
{
_state = memento.GetState();
Console.WriteLine("从备忘录恢复状态:" + _state);
}
}
// 负责人类
class Caretaker
{
private Memento _memento;
public Memento Memento
{
get { return _memento; }
set { _memento = value; }
}
}
class Program
{
static void Main(string[] args)
{
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.State = "状态1";
originator.State = "状态2";
caretaker.Memento = originator.SaveStateToMemento();
originator.State = "状态3";
originator.GetStateFromMemento(caretaker.Memento);
Console.ReadKey();
}
}