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

首先需要一个备忘录类。

  1.     public class Memento
  2.  
  3.     {
  4.  
  5.         private string _msg;
  6.  
  7.         public Memento(string msg)
  8.  
  9.         {
  10.  
  11.             _msg = msg;
  12.  
  13.         }
  14.  
  15.         public string GetText()
  16.  
  17.         {
  18.  
  19.             return _msg;
  20.  
  21.         }
  22.  
  23.     }
  24.  

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

接下来就是Nodepad类。

  1.     public class Notepad
  2.  
  3.     {
  4.  
  5.         private string _msg;
  6.  
  7.         public Memento SetMsg(string msg)
  8.  
  9.         {
  10.  
  11.             Memento m = new Memento(msg);
  12.  
  13.             _msg = msg;
  14.  
  15.             return m;
  16.  
  17.         }
  18.  
  19.         public string GetMsg()
  20.  
  21.         {
  22.  
  23.             return _msg;
  24.  
  25.         }
  26.  
  27.         public void Undo(Memento previousState)
  28.  
  29.         {
  30.  
  31.             if (previousState != null)
  32.  
  33.             {
  34.  
  35.                 _msg = previousState.GetText();
  36.  
  37.             }
  38.  
  39.             else
  40.  
  41.             {
  42.  
  43.                 _msg = "";
  44.  
  45.             }
  46.  
  47.         }
  48.  
  49.     }
  50.  

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

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

  1.     class Program
  2.  
  3.     {
  4.  
  5.         static void Main(string[] args)
  6.  
  7.         {
  8.  
  9.             IList<Memento> undos = new List<Memento>();
  10.  
  11.             Notepad notepad = new Notepad();
  12.  
  13.             Memento undo;
  14.  
  15.             undo = notepad.SetMsg("Hello");
  16.  
  17.             undos.Add(undo);
  18.  
  19.             undo = notepad.SetMsg("World");
  20.  
  21.             undos.Add(undo);
  22.  
  23.             Console.WriteLine("进入Nodepad查看信息");
  24.  
  25.             Console.WriteLine(notepad.GetMsg());
  26.  
  27.             Console.WriteLine("1、接着执行一个回退操作");
  28.  
  29.             notepad.Undo(undos[0]);
  30.  
  31.             Console.WriteLine("回退操作以后查看信息");
  32.  
  33.             Console.WriteLine(notepad.GetMsg());
  34.  
  35.             Console.WriteLine("2、再执行一个回退操作");
  36.  
  37.             notepad.Undo(null);
  38.  
  39.             Console.WriteLine("回退操作以后再查看信息");
  40.  
  41.             Console.WriteLine(notepad.GetMsg());
  42.  
  43.             Console.ReadKey();
  44.  
  45.         }
  46.  
  47.     }
  48.  

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

用最简单的例子理解备忘录模式(Memento Pattern)的更多相关文章

  1. 用最简单的例子理解复合模式(Composite Pattern)

    在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public ...

  2. 用最简单的例子理解命令模式(Command Pattern)

    假设想让遥控器控制电灯的开关.电视机的开关和切换,该如何做? 所有的开.关.切换都是遥控器发出的指令,把这些指令统一抽象成一个接口. public interface IControl { void ...

  3. 用最简单的例子理解迭代器模式(Iterator Pattern)

    迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装 ...

  4. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  5. 备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  6. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...

  7. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...

  8. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  9. 备忘录模式-Memento Pattern

    1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...

随机推荐

  1. ASP.NET中Literal,只增加纯粹的内容,不附加产生html代码

    页面代码 <div style="float: right; color: #666; line-height: 30px; margin-right: 12px;" id= ...

  2. SQL之PROCEDURE(存储过程)

    先来看一小段代码 create procedure pr_bank(@bank_id int) as BEGIN select *from bank where bank_ID = @bank_id ...

  3. IE6 验证码刷新失败显示空白解决办法

    原因:点击a标签看不清?换图片 结果验证码显示的空白! 解决办法:在对应的点击事件最后加上return false 即可解决问题. 下面是HTML源码: <p class="regis ...

  4. 简单实现textview文本每隔两秒就改变一次

    //这个方法可以实现文本每隔两秒就改变一次, public void textTask(){ final android.os.Handler handler=new android.os.Handl ...

  5. 【LOJ】#2290. 「THUWC 2017」随机二分图

    题解 看了一眼觉得是求出图对图统计完美匹配的个数(可能之前做过这样模拟题弃疗了,一直心怀恐惧... 然后说是统计一下每种匹配出现的概率,也就是,当前左边点匹配状态为S,右边点匹配状态为T,每种匹配出现 ...

  6. const理解

    const int * a4 = &a1; ///const data,non-const pointer int * const a5 = &a1; ///non-const dat ...

  7. ubuntu 安装 eslint

    1. 安装 npm install -g eslint 安装结束后记住 /usr/local/bin/eslint -> /usr/local/lib/node_modules/eslint/b ...

  8. ThinkPHP导入第三方类库Vendor

    详情查看ThinkPHP3.2手册 架构 > 自动加载 章节 vendor('Uploader','','.class.php')

  9. JAVAEE——BOS物流项目14:Linux部署(安装jdk、tomcat、mySQL)和扩展资料

    1 学习计划 1.Linux部署 n 安装jdk n 安装tomcat n 安装MySQL n 将项目发布到tomcat 2.扩展资料 2 Linux部署 2.1 安装jdk 第一步:获取Linux系 ...

  10. fast协议解读

    目录 背景 fast协议特征 fast协议解读 背景 股票行情一般传输的数据类型为: int / long / float /double / string 来表示行情价格成交量之类的数据. 正常传输 ...