原文  第18章 备忘录模式(Memento Pattern)

备忘录模式

      概述:

备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。
定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

结构图:

 

     代码举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    /// <summary>
    /// 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
    /// </summary>
    class Originator
    {
        private string state;
        //获取状态
        public string GetState()
        
          return state;
              
        }
        public string State
        {
            set {
                state = value;
            }
            get {
                return state;
            }
        }
        //创建备忘录
        public Memento Create()
        {
            return new Memento(state);
        }
        //恢复备忘录
        public void Recover(Memento memento)
        {
            this.state = memento.State;
        }
 
        
    }
    /// <summary>
    /// 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
    /// </summary>
    class Memento
    {
        private string state = "";
        public Memento(string state)
        {
            this.state = state;
        }
        public string State
        {
            set
            {
                state = value;
            }
            get
            {
                return state;
            }
        }
 
    }
    /// <summary>
    /// 管理角色:对备忘录进行管理,保存和提供备忘录。
    /// </summary>
    class Caretaker
    {
        private Memento memento;
        public Memento Memento
        {
            get return memento;}
            set { memento=value;}
        }
 
    }

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 class Program
    {
        static void Main(string[] args)
        {
            Originator originator = new Originator();
            originator.State = "状态一";
            Caretaker caretaker = new Caretaker();
            //备份状态
            caretaker.Memento = originator.Create();
            originator.State = "状态二";
            //恢复状态
            originator.Recover(caretaker.Memento);
            //结果输出状态一
            Console.WriteLine(originator.State);
            Console.ReadLine();
        }
    }

一个很简单的备忘录模式就写好了,其实就是把对象存到一个地方,需要的时候就去取回来。当然我们平常用到的肯定不是上面的只能存储一个备忘录的,应该是存储很多个状态的。比如我们可以在上面的存储对象的地方用一个集合来存储要备忘的对象,这样就可以很容易的实现多个状态存储。

适用场景:

 

1.如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式

2.一个类需要保存它的对象的状态(相当于Originator角色)

3.设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)

4.需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存

5.undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

设计模式系列文章入口:http://www.diyibk.com/post/39.html

第18章 备忘录模式(Memento Pattern)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 备忘录模式-Memento Pattern

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

  7. 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...

  8. php备忘录模式(memento pattern)

    晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...

  9. 十一个行为模式之备忘录模式(Memento Pattern)

    定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...

随机推荐

  1. CF 148D. Bag of mice (可能性DP)

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. chrome 关闭自己主动更新

    一不小心,把chrome更新成了37, chrome 37不支持模态窗体[ window.showModalDialog() ],折腾死人了. 实在抵不住,仅仅好降级成36.0.1985.143m 至 ...

  3. Eclipse在Jar形成和应用程序包

    最近的熟悉Java语言.在学习过程中Eclipse经常使用再熟悉它.本文简单说下Jar形成和应用程序包. Java在Jar相当于包C/C++该lib库,它是.class文件打包:经常使用Jar包有AP ...

  4. MVC 应用免受 CSRF攻击

    保护ASP.NET 应用免受 CSRF 攻击   CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack ...

  5. Android - 数据存储 -在SQL数据库中保存数据

    对于重复的或结构化的数据,保存到数据库中是很好的选择,比如联系人信息.这里假设你对SQL数据库大体上了解然后帮助你学习Android上的SQLite数据库.在Android数据库上需要用到的API可以 ...

  6. ECharts SSH+JQueryAjax+Json+JSP在数据库中的数据来填充ECharts在

    1导入包.设定SSH框架. 进口JQuery的JS包.<script src="JS/jquery-1.7.1.js"></script> 导入EChart ...

  7. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

  8. Android Activity之间通信

    package com.example.myapp; import android.app.Activity; import android.content.DialogInterface; impo ...

  9. 读改善c#代码157个建议:建议4~6

    目录: 建议4:TryParse比Parse好 建议5:使用int?确保值类型也可以为null 建议6:区别 readonly 和 const 的用法 一.建议4:TryParse比Parse 好 T ...

  10. 几个cd快速提示

    cd是project师每天都会用到的命令. 今天就来分享几条和cd有关的小技巧 cd 假设你用cd ~来进入当前用户的home文件夹的话,那么能够试试直接敲cd. 相同效果,少敲两下键盘. cd - ...