原文  第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. Unix编程艺术札记版本

    这本书是一位面试官告诉我,.非常感谢他的忠告.面试的说明.我写后认为,足.一方面是面试的技巧.另一方面就是学习的方法. 阅读这本书非常享受,加上之前的积累,一些疑惑,另一些基础的不足,在这本书里找 ...

  2. c# 通过配置自动附加数据库

    using System; using System.Collections.Generic; using System.Windows.Forms; using System.Data.SqlCli ...

  3. hdu 1171 Big Event in HDU(母函数)

    链接:hdu 1171 题意:这题能够理解为n种物品,每种物品的价值和数量已知,现要将总物品分为A,B两部分, 使得A,B的价值尽可能相等,且A>=B,求A,B的价值分别为多少 分析:这题能够用 ...

  4. 玩转Web之easyui(一)-----easy ui datagird 分页

    easy ui 中数据表格的分页其实是很简单的,分页是在数据表格可以正常显示数据的基础上进行的,在这里给出servlet的代码,其中selectAll()方法是从数据库中提取所有数据, 分页的一种思路 ...

  5. Linux互斥和同步应用程序(四):posix互斥信号和同步

           [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章仅供学习交流,请勿用于商业用途]          在前面讲共享内 ...

  6. 系列四TortoiseSvn客户端软件

    原文:系列四TortoiseSvn客户端软件 TortoiseSvn介绍 TortoiseSvn 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中 ...

  7. Machine Learning—Linear Regression

    Evernote的同步分享:Machine Learning-Linear Regression 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  8. Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)

    Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)  本篇博客介绍Cocos2d-x 3.2中Lua演示样例的音频測试.Cocos2d-x使用SimpleAudi ...

  9. 孙陪你,了解它的权力--Kinect结合的发展Unity3D游戏应用开发

    unity3d正在使用kinect三维模型数据控制(它切成脚本) 博主在做项目时须要利用kinect数据控制三维模型中人物的动作.但不是实时控制,而是利用之前获得的骨骼数据,直接控制.无需再利用脚本打 ...

  10. SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue性能测试(转)

    听说JDK6对SynchronousQueue做了性能优化,避免对竞争资源加锁,所以想试试到底平时是选择SynchronousQueue还是其他BlockingQueue. 对于容器类在并发环境下的比 ...