23种设计模式----备忘录模式(Memento Pattern)

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以把该对象恢复到原先的状态。

发起人角色:记录当前时刻的内部状态,负责创建和恢复备忘录数据。
备忘录角色:负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态。
管理者角色:负责保存备忘录对象。

public class Person
{
    public string name { get; set; }
    public string sex { get; set; }
}

public class PersonOperate
{
    public List<Person> personList { get; set; }
    public PersonOperate(List<Person> persons)
    {
        personList = persons;
    }

    public ContentMemento CreateMemnto()
    {
        // 这里也应该传递深拷贝,new List方式传递的是浅拷贝,
        // 因为ContactPerson类中都是string类型,所以这里new list方式对ContactPerson对象执行了深拷贝
        // 如果ContactPerson包括非string的引用类型就会有问题,所以这里也应该用序列化传递深拷贝
        return new ContentMemento(new List<Person>(personList));
    }

    public void RestoreMento(ContentMemento memento)
    {
        this.personList = memento.personList;
    }

    public void show()
    {
        Console.WriteLine("联系人列表中有{0}个人,他们是:", this.personList.Count);
        foreach (var item in personList)
        {
            Console.WriteLine("姓名: {0} 号码为: {1}", item.name, item.sex);
        }
    }
}

public class ContentMemento
{
    public List<Person> personList;
    public ContentMemento(List<Person> persons)
    {
        
        personList = persons;
    }
}

public class Mananger
{
    public ContentMemento memnto { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person>  persons = new List<Person>
        {
            new Person() { name="aaa",sex="男" },
            new Person() { name="bb",sex="女" },
            new Person() { name="cc",sex="男" },
            new Person() { name="dd",sex="女" }
        };
        
        PersonOperate op = new PersonOperate(persons);
        op.show();

        Mananger manager = new Mananger();
        manager.memnto = op.CreateMemnto();
        
        persons.RemoveAt(1);
        op.show();

        op.RestoreMento(manager.memnto);
        op.show();

        Console.Read();
    }

优点:
如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。

缺点:
在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。

猜你喜欢

转载自blog.csdn.net/u012075901/article/details/88298674
今日推荐