设计模式之备忘录模式

名词解释:

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

使用场景:

你在玩游戏,突然有事,此时如果关闭电脑,进度肯定木有了,然后你就点击保存,关闭电脑出去了;完事之后,你又点击加载进度,又开始玩了,这个就是一个标准的备忘录模式场景。

必需元素:

发起人:负责创建一个备忘录,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态 。发起人可根据需要决定备忘录存储发起人的哪些内部状态。

备忘录:负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录。备忘录有两个接口,管理者只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。发起人能够看到一个宽接口,允许它访问到先前状态所需的所有数据。

管理者:负责保存好备忘录,不能对备忘录的内容进行操作或检查(其实就是来管理备忘录数据的)。

其实说白了,备忘录是一个实体类,存放所有要备忘的状态(属性);而发起人呢也有自己的状态(也可以成为属性),当然也必须有用于保存备忘录和恢复备忘录的方法;管理者中呢就是有一个备忘录的对象,当然是用于保存发起人保存的备忘录也供发起人恢复使用。

上例子:

发起者:

 /// <summary>
    /// 发起者
    /// </summary>
    class Originator
    {
        private string state;
        /// <summary>
        /// 要保存的属性(你可以随便添加哦)
        /// </summary>
        public string State
        {
            get { return state; }
            set { state = value; }
        }

        /// <summary>
        /// 创建备忘录
        /// </summary>
        /// <returns></returns>
        public Memento CreateMemento()
        {
            return new Memento(state);
        }

        /// <summary>
        /// 恢复备忘录
        /// </summary>
        /// <param name="memento"></param>
        public void SetMemento(Memento memento)
        {
            state = memento.State;
        }

        public void Show()
        {
            Console.WriteLine("State="+state);
        }
        
    }

备忘录类:

 /// <summary>
    /// 备忘录
    /// </summary>
    class Memento
    {
        private string state;
        /// <summary>
        /// 保存的属性(通常和发起者类中的属性一一对应)
        /// </summary>
        public string State
        {
            get { return state; }
        }
        public Memento(string state)
        {
            this.state = state;
        }
    }

管理者:

  /// <summary>
    /// 管理者类(主要是隔离了发起者和备忘录,主要就是存放了备忘录对象)
    /// </summary>
    class Caretaker
    {
        private Memento memento;
        /// <summary>
        /// 备忘录对象
        /// </summary>
        public Memento Memento
        {
            get { return memento; }
            set { memento = value; }
        }
    }

 使用:

        //定义发起者对象
            Originator o = new Originator();
            //设置需要保存的属性
            o.State = "ON";
            o.Show();

            //定义管理者对象
            Caretaker c = new Caretaker();
            //创建备忘录
            c.Memento = o.CreateMemento();

            //吸怪属性
            o.State = "OFF";
            o.Show();

            //恢复备忘录
            o.SetMemento(c.Memento);
            o.Show();

            Console.Read();

 其实,这个备忘录模式应该是蛮简单的,就是一个类存储一些要保存的信息,可以进行保存和恢复,最主要是我们通过一个管理者类将发起者和备忘录类进行了隔离。

posted @ 2013-09-09 22:00  wangyafei_it  阅读(186)  评论(0编辑  收藏  举报