备忘录模式

简介:

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

      可使用数据回滚,恢复先前状态。

 

介绍:

备忘录模式结构

 

特征
优点

1.将数据恢复成原来正确的数据,配合文件、数据库等存储方式。

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

3.将数据状态恢复到某个特定的步骤。

缺点

1.如需要多个备份,对资源消耗过大。

2.所备份的内存不知。

特点

1.备忘录(Memento)存储原发器(Originator)对象的内部状态。适用于“由原发器管理,却又必须存储在原发器之外的信息”。

2.为了符合“迪米特原则”,还要增加一个管理备忘录的类。

角色
发起人角色(Originator)负责创建和恢复备忘录数据,负责创建一个返回备忘录实例的方法。
备忘录角色(Memento)负责存储发起人对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。
管理者角色(Caretaker)负责保存备忘录对象,不能对备忘录的内容进行访问或者操作。

 

        Memento模式和Command模式有些类似。Memento备忘录模式和Command命令模式其实还是有些细微的差别的。虽然两者都支持Undo操作,但是Command是对行为的封装,Memento是对对象状态的保留,这是目的上的不同。它们支持的也是Undo操作的不同层面,Command是对行为序列的操作,Memento是对行为状态的操作。命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式保存的是发起人的状态(而状态对应的数据结构,如属性)。

 

使用: 

    本案例的意思是存储手机通讯录。

    //Data
    public sealed class AdressList
    {
        public string Name;
        public string Mobile;
    }

    //Originator
    public sealed class Originator
    {
        public List<AdressList> _list;

        public Originator(List<AdressList> list)
        {
            if (list != null)
            {
                _list = list;
            }
        }

        //create
        public Memento CreateMemento()
        {
            return new Memento(new List<AdressList>(_list));
        }

        //restore
        public void RestoreMemento(Memento memento)
        {
            _list = memento._list;
        }

        public void Show()
        {
            foreach (var person in _list)
            {

            }
        }
    }

    //Memento
    public sealed class Memento
    {
        public List<AdressList> _list { get; private set; }

        public Memento(List<AdressList> list)
        {
            _list = list;
        }
    }

    //Caretaker
    public sealed class MementoManger
    {
        public Memento memento;
    }
            //备忘录模式调用
            //数据
            List<AdressList> list = new List<AdressList>()
            {
                new AdressList() {Name = "Jordon", Mobile = "1"},
                new AdressList() {Name = "Yao Ming", Mobile = "2"},
            };

            //显示
            Originator listOrigin = new Originator(list);
            listOrigin.Show();

            //创建备忘录
            MementoManger manager = new MementoManger();
            manager.memento = listOrigin.CreateMemento();

            //更改
            listOrigin._list.RemoveAt(0);
            listOrigin.Show();

            //恢复
            listOrigin.RestoreMemento(manager.memento);
            listOrigin.Show();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值