原文  第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. 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  2. C++ Primer注意事项11_运算符重载_算术/关系运算符_下标运算符

    1.算术/关系运算符 平时,定义成非成员函数以同意左右側运算对象进行转换.由于这些运算符一般不须要改变运算对象的状态,所以形參都是常量的引用. 以"+"号运算符为例: Person ...

  3. java基础程序题

    发现自己初学java时保存在word里的练习题,哈哈,放博客里面来作为纪念吧~~~ [程序1]  题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔 ...

  4. Chapter 1 Securing Your Server and Network(2):管理服务的SIDs

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/37927319 ,专题文件夹:http://blog.csdn.net/dba_huang ...

  5. pragma once与#ifndef的作用有什么区别

    #pragma once 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 #pragma once用来防止某个头文件被多次include,#ifndef,#defi ...

  6. CodeForces 22D Segments 排序水问题

    主题链接:点击打开链接 升序右键点.采取正确的点 删边暴力 #include <cstdio> #include <cstring> #include <algorith ...

  7. Android - 和其他APP交互

    一个Android app通常有好几个activity.每个activity显示一个可以让用户执行特殊操作(例如看地图,照相等)的界面.要让用户从一个activity切换到另一个activity,ap ...

  8. HDU 1232:流问题(并检查集合)

    pid=1232">畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. 由<a href = "#" > 引发的思考

    原文:由<a href = "#" > 引发的思考 前阵子在一个移动项目中,通过 <a href = "#" >  的方式 绑定clic ...

  10. SDUTOJ 1298 活动选择

    #include<iostream> #include<memory.h> using namespace std; int a[105],b[105],c[105],d[10 ...