zoukankan      html  css  js  c++  java
  • 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作。假设让一个Notepad支持回退操作,如何实现呢?


    首先需要一个备忘录类。

        public class Memento
    
        {
    
            private string _msg;
    
            public Memento(string msg)
    
            {
    
                _msg = msg;
    
            }
    
            public string GetText()
    
            {
    
                return _msg;
    
            }
    
        }
    

    以上,
    ○ 构造函数在Nodepad每次记录信息的时候调用,Nodepad所记录的信息最终通过该构造函数赋值给了_msg字段。
    ○ GetText方法在Nodepad执行回退操作的时候调用

     

    接下来就是Nodepad类。

        public class Notepad
    
        {
    
            private string _msg;
    
            public Memento SetMsg(string msg)
    
            {
    
                Memento m = new Memento(msg);
    
                _msg = msg;
    
                return m;
    
            }
    
             
    
            public string GetMsg()
    
            {
    
                return _msg;
    
            }
    
            public void Undo(Memento previousState)
    
            {
    
                if (previousState != null)
    
                {
    
                    _msg = previousState.GetText();
    
                }
    
                else
    
                {
    
                    _msg = "";
    
                }
    
               
    
            }
    
        }
    

     

    ○ 维护着一个类型为string的字段_msg,代表显示在Nodepad上的文字
    ○ 记录信息方法SetMsg:不仅要把记录的信息赋值给_msg,还要把信息传递给备忘录类
    ○ 获取信息方法GetMsg:读取_msg
    ○ 回退操作方法Undo:把备忘录的上一次信息赋值给_msg。如果回退到第一次以前的操作,相当于备忘录为null,需要考虑为null的情况

     

    客户端需要有一个备忘录的列表,维护者所有的备忘录信息。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                IList<Memento> undos = new List<Memento>();
    
                Notepad notepad = new Notepad();
    
                Memento undo;
    
                undo = notepad.SetMsg("Hello");
    
                undos.Add(undo);
    
                undo = notepad.SetMsg("World");
    
                undos.Add(undo);
    
                Console.WriteLine("进入Nodepad查看信息");
    
                Console.WriteLine(notepad.GetMsg());
    
                Console.WriteLine("1、接着执行一个回退操作");
    
                notepad.Undo(undos[0]);
    
                Console.WriteLine("回退操作以后查看信息");
    
                Console.WriteLine(notepad.GetMsg());
    
                Console.WriteLine("2、再执行一个回退操作");
    
                notepad.Undo(null);
    
                Console.WriteLine("回退操作以后再查看信息");
    
                Console.WriteLine(notepad.GetMsg());
    
                Console.ReadKey();
    
            }
    
        }
    

    1

    ○ 第一次进入Notepad查看信息看到的是最后一次输入的World;
    ○ 回退一次,第二次进入Notepad查看信息看到的是第一次输入的Hello;
    ○ 再回退一次,第三次进入Notepad查看信息看到的是空字符串。   

  • 相关阅读:
    对缓存的思考——提高命中率
    2009年职场上必要做的事
    开始睡觉吧睡觉让人更聪明
    人脸识别和模式识别网址
    英语面试精彩问答摘录
    Some Image Processing related Websites
    转载:研究生应该常去的网站
    人工智能和图像网站
    转载:60个必须知道的生活常识
    《c程序设计》的算法归纳
  • 原文地址:https://www.cnblogs.com/darrenji/p/3963557.html
Copyright © 2011-2022 走看看