C#设计模式系列:备忘录模式(Memento)
备忘录模式是一种行为型设计模式,它允许你将对象的状态保存到备忘录中并在以后的时间点将对象恢复到先前的状态。
适用场景
- 需要即时保存和恢复内部状态的对象。
- 当直接访问对象内部状态的成本比通过备忘录进行恢复操作更高时。
- 需要保留对象状态历史记录的情况,以便回滚操作等。
实现方法
备忘录模式包含三个主要的角色:Originator、Memento、Caretaker。
Originator
Originator是需要保存状态的对象。它创建备忘录并使用它来恢复其内部状态。原发器提供了一个创建备忘录的方法,并实现了使用备忘录恢复其状态的方法。
public class Originator
{
private string _state;
public string State
{
get { return _state; }
set
{
_state = value;
Console.WriteLine($"State set to {_state}");
}
}
public Memento CreateMemento()
{
Console.WriteLine("Creating memento...");
return new Memento(_state);
}
public void RestoreFromMemento(Memento memento)
{
_state = memento.GetState();
Console.WriteLine($"State restored to {_state}");
}
}
Memento
Memento是原发器状态的快照。备忘录存储状态的一些简单数据结构。它只公开了两个方法:GetState()来获得之前记录的状态以及GetType(),通常可用于标识备忘录的类型。
public class Memento
{
private readonly string _state;
public Memento(string state)
{
_state = state;
}
public string GetState()
{
return _state;
}
}
Caretaker
Caretaker负责保存备忘录,并提供使用备忘录的方法。它不能访问备忘录的状态,它只管理备忘录的保存和恢复。
public class Caretaker
{
private readonly List<Memento> _mementos = new List<Memento>();
private Originator _originator;
public Caretaker(Originator originator)
{
_originator = originator;
}
public void Backup()
{
_mementos.Add(_originator.CreateMemento());
}
public void Undo()
{
if (_mementos.Count == 0)
{
return;
}
var memento = _mementos.Last();
_mementos.Remove(memento);
_originator.RestoreFromMemento(memento);
}
public void ShowHistory()
{
Console.WriteLine("History:");
foreach (var memento in _mementos)
{
Console.WriteLine(memento.GetState());
}
}
}
使用方法
var originator = new Originator { State = "On" };
var caretaker = new Caretaker(originator);
caretaker.Backup();
originator.State = "Off";
caretaker.Backup();
originator.State = "On";
caretaker.Backup();
originator.State = "Off";
caretaker.ShowHistory();
caretaker.Undo();
caretaker.Undo();
caretaker.Undo();
总结
备忘录模式是一种非常有用的设计模式,它允许我们对对象的状态进行保存和恢复。备忘录模式优雅的解决了在保存对象状态时所面临的问题,并提供了一种简单的方式来回滚到之前记录的状态。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#设计模式系列:备忘录模式(Memento) - Python技术站