原文  第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. java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错(转)

    我遇到这个错误是因为在引用脚本目录时,设置错了位置.设置成脚本所在目录的上级目录. lua使用和加载初始化方法 在java中使用lua,使用需要引用 luaj-jse-2.0.2.jar 同时需要使用 ...

  2. Java中使用Lua脚本语言(转)

    Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的).Lua在C\C++的实现我就不多说了,网上随便一搜,到处 ...

  3. 【YouVersion】 The Bible 圣经App

    [YouVersion] The Bible 圣经 App 今天向大家郑重推荐一款非常棒的圣经App : <The Bible>   YouVersion 团队开发的全球下载量和安装数目第 ...

  4. linux添加到普通用户sudo才干

    在超级用户模式添加到普通用户sudo才干 1. su -(进root用户) 2. chmod u+w /etc/sudoer 3. vim /etc/sudoers 于root ALL=(ALL) A ...

  5. Flex里的特效

      Flex中提供了丰富的效果组件.因为效果是一种依据时间渐变的过程,因此全部效果都具有duration属性,用来设置播放时间(以毫秒为单位).也能够通过设置repeatCount属性和repeatD ...

  6. 泛泰A820L (高通公司MSM8660 cpu) 3.4内核CM10.1(Android 4.2.2) 测试版第二版

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  7. Shell 文字 顶替tomcat星团war包裹

    执行前server造成免费ssh登陆. 修改配置文件不是太大 您可以覆盖原有的配置 profile 简介 bak=/home/wsm/bak webapps=/home/wsm/webapps/WSM ...

  8. SQL Server 性能优化(一)——简介

    原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投 ...

  9. 变化Android系统属性SystemProperties.set(&quot;sys.powerctl&quot;, &quot;shutdown&quot;)关机分析

    基本介绍: 从以前的博客中提到,我们,最后,通过关机过程变化Android关机属性(SystemProperties.java由JNI呼叫接入系统属性),当然,我们也能adb命令变化Android系统 ...

  10. (二)给IE6-IE9中的input添加HTML5新属性-placeholder

    同样是最近遇到的一个小问题.因为IE9以下input是不支持placeholder属性的.在网上找到了解决方案,果断带走.正如鲁迅先生所说的‘拿来主义’:运用脑髓,放出眼光,自己来拿!感谢.借花献佛在 ...