[整理] 设计模式之备忘录模式

概述

备忘录模式(Memento [mə'mentəʊ] ):
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

应用场合

  1. 必须保存一个对象在某一时刻(部分)的状态,这样以后需要时它才能恢复到先前的状态。
  2. 如果用一个接口来让其他对象直接得到这个状态,将会暴露对象的实现细节并破坏对象的封装性。

类图

代码结构实例

1. 创建一个备忘录类

    /// <summary>
    /// 备忘录类
    /// </summary>
    class Memento
    {
        private string _state;

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

2. 发起人类

Originator [ə'rɪdʒə.neɪtə]

    /// <summary>
    /// 发起人类
    /// </summary>
    class Originator
    {
        /// <summary>
        /// 需要保存的属性
        /// </summary>
        private string state;
        public string State 
        {
            get { return state; }
            set { state = value; }
        }
        /// <summary>
        /// 创建备忘录,将当前需要保存的信息导入并实例化一个Memento对象
        /// </summary>
        /// <returns></returns>
        public Memento CreateMemento() 
        {
            return (new Memento((state)));
        }
        /// <summary>
        /// 恢复备忘录模式,将Memento导入并将相关数据恢复
        /// </summary>
        /// <param name="memento"></param>
        public void SetMemento(Memento memento) 
        {
            state = memento.State;
        }
        /// <summary>
        /// 显示状态
        /// </summary>
        public void Show() 
        {
            Console.WriteLine("State="+state);
        }
    }

3. 管理者类

Caretaker ['keə.teɪkə]

    /// <summary>
    /// 管理者类
    /// </summary>
    class Caretaker
    {
        /// <summary>
        /// 得到备忘录
        /// </summary>
        private Memento memento;
        public Memento Memento 
        {
            get { return memento; }
            set { memento = value; }
        }
    }

4. 客户端调用

        /// <summary>
        /// 测试备忘录模式
        /// </summary>
        static void TestMemento() 
        {
            Originator o = new Originator();
            o.State = "On"; //初始状态
            o.Show();

            Caretaker c = new Caretaker();
            c.Memento = o.CreateMemento();//保存状态

            o.State = "Off";//状态改变为Off
            o.Show();

            o.SetMemento(c.Memento);//恢复原始状态
            o.Show();
            Console.Read();
        }

小结

备忘录模式好像大部分在游戏程序设计里使用,来保存游戏状态

posted @ 2020-12-22 15:19  哆啦梦乐园  阅读(61)  评论(0编辑  收藏  举报