C# 设计模式-备忘录模式

一.介绍  

  备忘录模式(Memento Pattern)。属于行为型模式。它在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

二.实现

  备忘录顾名思义就是可以存储多个信息的工具。在该模式下,如果一个对象出现了多种状态,通过管理者的集合去存储这个对象的不同状态,之后就能够根据需要恢复各种时刻的状态。

//备忘录(存储发起人的内部状态)
public class Mememto
{
    public string Text { get; set; }
}

//发起人(记录当前时刻的内部状态,恢复备忘录状态后重新记录当前状态)
public class Originator
{
    private string text = "";
    public void SetMememto(Mememto m)
    {
        text = m.Text;
    }
    public Mememto CreateMememto(string text)
    {
        return new Mememto { Text = text };
    }

    public override string ToString()
    {
        return $"text is :{text}";
    }
}

//管理角色(负责保存备忘录对象)
public class Caretaker
{
    private Dictionary<int, Mememto> mememtos = new Dictionary<int, Mememto>();
    public void AddMememto(Mememto m)
    {
        var count = mememtos.Count();
        mememtos.Add(++count, m);
    }
    public Mememto GetMememto(int key)
    {
        if (key > 0 && key <= mememtos.Count)
        {
            return mememtos[key];
        }
        throw new NotSupportedException();
    }
}

//调用
public static void Main(string[] args)
{
    Originator originator = new Originator();
    Caretaker caretaker = new Caretaker();
    for (var i = 0; i < 10; i++)
    {
        var m = originator.CreateMememto($"第{i + 1}次备忘");
        caretaker.AddMememto(m);
        Console.WriteLine($"Action {i + 1}次后:");
        Console.WriteLine(m.Text);
    }

    for (var i = 10; i > 0; i--)
    {
        var m = caretaker.GetMememto(i);
        originator.SetMememto(m);
        Console.WriteLine($"恢复存档{m}后:");
        Console.WriteLine(m.Text);
    }
}

三.总结

  优点:

  1.如果某个操作错误地破坏了对象的完整性,此时可以使用备忘录模式将对象修复成原来正确的数据。

  2.备份的状态数据保存在发起人角色之外,这个发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理人角色管理,符合单一职责原则。

  缺点:

  1.在实际的系统中,可能需要维护多份备份,需要消耗额外的资源,对性能有较大影响。

posted @ 2021-02-02 15:46  shine声  阅读(219)  评论(0编辑  收藏  举报