简介

定义:
  • 在不破坏封装的前提下,捕获一个对象的【内部状态】,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
角色:
  • 发起人Originator:要被备份的成员,它提供一创建备忘录的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中。并提供另外一个方法将备忘录中的信息覆盖自身的信息。
  • 备忘录Memento:备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态。
  • 管理角色(Caretaker):用于管理备忘录对象的实现类。
适用场合:
  • 它适用于对象在执行某些操作时,为防止意外,而在执行操作前,将对象状态备份的场景,有点类似于【事务回滚】的意思。
  • 功能比较复杂的,但是需要维护或记录属性历史的类
  • 需要保存的属性只是众多属性的一小部分时
好处:
  • 有时一些发起人对象的内部信息必须【保存在】发起人对象以外的地方,但是必须要由发起人对象自己读取,这时使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持【封装】的边界
  • 本模式【简化】了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本
  • 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原
缺点:
  • 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在【资源消耗】上面备忘录对象会很昂贵
  • 当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵

演示

/** 发起人Originator,要【被备份】的类 */
public class Originator {
    /**需要被保存的内部状态*/
    public String date;
    public int num;
    /**提供一个【创建备忘录】的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中(或者可以直接将对象自身this作为参数传入) */
    public Memento createMemento() {
        return new Memento(this);
    }
    /**提供一个将备忘录中的信息【覆盖】自身信息的方法*/
    public void setMemento(Memento memento) {
        date = memento.date;
        num = memento.num;
    }
    public void show() {
        System.out.println(date + "---" + num);
    }
}

/**备忘录Memento,备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态 */
public class Memento {
    public String date;
    public int num;
    public Memento(Originator org) {
        this.date = org.date;
        this.num = org.num;
    }
}

/** 管理角色Caretaker,用于管理备忘录对象。不能对备忘录的内部进行操作或检查 */
public class Caretaker {
    private Memento memento;
    public Memento getMemento() {
        return this.memento;
    }
    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

public class Test {
    public static void main(String[] args) {
        //原始数据
        Originator org = new Originator();
        org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());
        org.num = 99;
        org.show();
        //创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复
        Memento memento = org.createMemento();
        // 创建一个备忘录管理类,用于管理备忘录对象(其实基本没什么卵用)
        Caretaker ctk = new Caretaker();
        ctk.setMemento(memento);
        //改变原始数据的状态
        org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());
        org.num = 100;
        org.show();
        Memento memento2 = org.createMemento();
        // 恢复之前保存的状态(将保存的数据导入)
        org.setMemento(ctk.getMemento());
        org.show();
        ctk.setMemento(memento2);
        org.setMemento(ctk.getMemento());
        org.show();
    }
}

去除掉管理类
public class Test {
    public static void main(String[] args) {
        //原始数据
        Originator org = new Originator();
        org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());
        org.num = 99;
        org.show();
        //创建一个备忘录对象,保存原始数据的状态,目的是可以在需要时恢复
        Memento memento = org.createMemento();
        //改变原始数据的状态
        org.date = new SimpleDateFormat("HH-mm-ss_SSS").format(new Date());
        org.num = 100;
        org.show();
        Memento memento2 = org.createMemento();
        // 恢复之前保存的状态(将保存的数据导入)
        org.setMemento(memento);
        org.show();
        org.setMemento(memento2);
        org.show();
    }
}

附件列表

Memento 备忘录 快照模式的更多相关文章

  1. Memento 备忘录 快照模式 MD

    备忘录模式 简介 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供 ...

  2. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  3. 设计模式(18)--Memento(备忘录模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...

  4. 设计模式20:Memento 备忘录模式(行为型模式)

    Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某 ...

  5. 设计模式学习笔记--备忘录(Mamento)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...

  6. 十八、Memento 备忘录设计模式

    原理: 代码清单: Memento public class Memento { int mondey; ArrayList fruits; Memento(int mondey){ this.mon ...

  7. 23种设计模式 - 状态变化(Memento备忘录 - State)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 状态变化 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的 ...

  8. 15天玩转redis —— 第十篇 对快照模式的深入分析

    我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案. 一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是S ...

  9. 18、Memento 备忘录模式

    例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...

随机推荐

  1. Python Tutorial 学习(八)--Errors and Exceptions

    Python Tutorial 学习(八)--Errors and Exceptions恢复 Errors and Exceptions 错误与异常 此前,我们还没有开始着眼于错误信息.不过如果你是一 ...

  2. NLP相关资源

    一 NLP相关资源站点 Rouchester大学NLP/CL会议列表 一个非常好的会议时间信息网站,将自然语言处理和计算语言学领域的会议,按照时间月份顺序列出. NLPerJP 一个日本友好人士维护的 ...

  3. Java中的自动拆箱装箱(Autoboxing&Unboxing)

    一.基本类型打包器 1.基本类型:long.int.double.float.boolean 2.类类型:Long.Integer.Double.Float.Boolean 区别:基本类型效率更高,类 ...

  4. Ubuntu下安装和配置Apache2

    http://www.blogjava.net/duanzhimin528/archive/2010/03/05/314564.html 在Ubuntu中安装apache 安装指令:sudo apt- ...

  5. Timus1132(二次剩余方程求解)

    题目:http://acm.timus.ru/problem.aspx?space=1&num=1132 题意:就是给出方程,p为素数,求在区间内的解. 这个思路很简单,详见:http://a ...

  6. 本地yum源

    <pre name="code" class="html">1.为DVD创建一个挂载目录 [root@localhost ~]# mkdir /me ...

  7. Git skills in reseting files

    How to uncommit files that were committed long time a ago?Note: Since all changes in the current wor ...

  8. POJ-3580-SuperMemo(splay的各种操作)

    题意:对数组进行各种操作 其中 REVOLVE右移操作.将区间[a,b]右移c位 首先c可能比较多,可以先对区间长度取模. 在右移之后,可以发现[a,b]被分为两个区间[a,b-c]  [b-c+1, ...

  9. (转载)URL与URI的区别

    (转载)http://blog.csdn.net/eagle51998/article/details/372052 1  URL(Uniform Resoure Locator:统一资源定位器)是W ...

  10. 字符串(LCT,后缀自动机):BZOJ 2555 SubString

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1620  Solved: 471 Description 懒得写背景了 ...