简介

定义:
  • 在不破坏封装的前提下,捕获一个对象的【内部状态】,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
角色:
  • 发起人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. var a =a || {}

  2. 独家分享——大牛教你如何学习Web前端开发

    2014-12-18 14:35:42     引语 自从2008年接触网站开发以来到现在已经有六个年头了,今天偶然整理电脑资料看到当时为参加系里面一个比赛而做的第一个网站时,勾起了在这网站开发道路上 ...

  3. 从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试

    通过从零到一的教程,我们已经得到了通过mnist训练集生成的caffemodel,主要包含下面四个文件: 接下来就可以利用模型进行测试了.关于测试方法按照上篇教程还是选择bat文件,当然python. ...

  4. PHP框架、库和软件资源大全(整理篇)

    php的资料 https://github.com/ziadoz/awesome-php Awesome PHP A curated list of amazingly awesome PHP lib ...

  5. #include< >和#include""的区别

    Answer 1:#include 会将指定文件的内容插入到源程序文件中.当使用的格式时,编译器会从环境变量INCLUDE所指定的路径中寻找file-name 文件,如果没有定义INCLUDE,C 编 ...

  6. c# 循环语句练习题;

    1. 求100以内质数的和 2. 兔子问题 3. 九九乘法表:   一行一行打印: 4. 有一张超大的纸:   纸质的厚度是0.01:   对折多少次,可以达到珠峰的高度:   按照8848来计算: ...

  7. oracle审计

    Orcale审计机制研究 1.   设置审计 1.1.  查看审计状态 SQL>conn /as sysdba; 已连接 SQL>show parameters audit_trail; ...

  8. 【HDOJ】2451 Simple Addition Expression

    递推,但是要注意细节.题目的意思,就是求s(x) = i+(i+1)+(i+2),i<n.该表达中计算过程中CA恒为0(包括中间值)的情况.根据所求可推得.1-10: 31-100: 3*41- ...

  9. BZOJ1611: [Usaco2008 Feb]Meteor Shower流星雨

    1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 904  Solved: 393 ...

  10. 【模拟】NCPC 2014 E ceremony

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1791 题目大意: N栋大楼(N<=100000),拆除的时候有两种选择的操作,可 ...