备忘录设计模式

2023-11-14 17:15:00 浏览数 (2)

备忘录设计模式是一个行为设计模式,它能够在不破坏对象的封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

基本概念

备忘录模式由三部分组成:

  1. Originator(发起人):创建一个备忘录并存储其当前的内部状态;还可以使用备忘录来恢复其内部状态。
  2. Memento(备忘录):存储Originator的内部状态。它应保护内容,不被任何其他代码修改。
  3. Caretaker(看管人):负责在适当的时间保存和恢复Originator对象的状态。

使用场景

备忘录设计模式主要在以下情景中使用:

  • 当你需要保存和加载对象的时刻快照,同时避免暴露对象的实现细节。
  • 当直接访问对象会破坏封装性,并且引导其他冗余问题或限制时。
  • 当你需要保存和恢复数据到一个先前的点(如撤销操作、保存游戏进度等)时。
  • 当直接接口获取的信息暴露会导致安全问题或违背封装原则时,可以通过备份对象的内部状态来提供一个简化的界面。

下面是使用C#实现备忘录模式的例子:

代码语言:javascript复制
public class Originator
{
    private string _state;

    public void SetState(string state)
    {
        this._state = state;
    }

    public Memento SaveStateToMemento()
    {
        return new Memento(_state);
    }
    
    public void GetStateFromMemento(Memento memento)
    {
        _state = memento.GetState();
    }
}

public class Memento
{
    private readonly string _state;

    public Memento(string state)
    {
        this._state = state;
    }

    public string GetState()
    {
        return _state;
    }
}

public class CareTaker
{
    private readonly List<Memento> _mementoList = new List<Memento>();

    public void Add(Memento state)
    {
        _mementoList.Add(state);
    }

    public Memento Get(int index)
    {
        return _mementoList[index];
    }
}

代码示例的使用:

代码语言:javascript复制
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();

originator.SetState("State #1");
originator.SetState("State #2");
careTaker.Add(originator.SaveStateToMemento());

originator.SetState("State #3");
careTaker.Add(originator.SaveStateToMemento());

originator.SetState("State #4");
Console.WriteLine("Current State: "   originator.GetState());

originator.GetStateFromMemento(careTaker.Get(0));
Console.WriteLine("First saved State: "   originator.GetState());
originator.GetStateFromMemento(careTaker.Get(1));
Console.WriteLine("Second saved State: "   originator.GetState());

结论

备忘录模式是一种非常有用的设计模式,在需要保存对象状态,以便在以后的某个时间点恢复的情况下,特别有帮助。然而,如果需要频繁地保存大量数据,这可能会占用大量的内存,所以在使用备忘录模式时需要谨慎考虑。

0 人点赞