1.意图

在不破坏封装性的前提下,捕获一个对象的内部状态。并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

2.别名

Token

3.动机

有时候有必要记录一个对象的内部状态。为了同意用户取消不确定的操作或从错误中恢复过来,须要实现检查点和取消机制,而要实现这些机制。你必须事先将状态信息保存在某处,这样才干是对象恢复到他们先前的状态。

4.适用性

下面情况使用Memento模式:

  • 必需保存一个对象在某一时刻的(部分)状态,这样以后须要时它能恢复到先前的状态。
  • 如果一个用接口来让其他对象直接得到这些状态。将会暴露对象的实现细节并破坏对象的封装性。

5.结构

主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人认为叫备份模式更形象些,通俗的讲下:如果有原始类A。A中有各种属性,A能够决定须要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢。就是一个用来存储备忘录的。且仅仅能存储,不能改动等操作。做个图来分析一下:

6.代码演示样例

Original类是原始类。里面有须要保存的属性value及创建一个备忘录类。用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类。持有Memento类的实例,该模式非常好理解。

直接看源代码:
实现代码:
数据结构:

public class Original {private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}public Original(String value) {this.value = value;}public Memento createMemento(){return new Memento(value);}public void restoreMemento(Memento memento){this.value = memento.getValue();}
}

实现:

public class Memento {private String value;public Memento(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}public class Storage {private Memento memento;public Storage(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}
}
測试类:

public class Test {

public static void main(String[] args) {// 创建原始类Original origi = new Original("egg");// 创建备忘录Storage storage = new Storage(origi.createMemento());// 改动原始类的状态System.out.println("初始化状态为:" + origi.getValue());origi.setValue("niu");System.out.println("改动后的状态为:" + origi.getValue());// 回复原始类的状态origi.restoreMemento(storage.getMemento());System.out.println("恢复后的状态为:" + origi.getValue());
}

}
“`
输出:
初始化状态为:egg
改动后的状态为:niu
恢复后的状态为:egg
简单描写叙述下:新建原始类时,value被初始化为egg,后经过改动,将value的值置为niu。最后倒数第二行进行恢复状态,结果成功恢复了。事实上我认为这个模式叫“备份-恢复”模式最形象。

7.相关模式

  • Command模式:命令模式能够使用备忘录来为可撤销的操作维护状态。
  • Iterator模式:如前所述备忘录可用于迭代。

引用:

http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539

Behavioral模式之Memento模式相关推荐

  1. 设计模式【17】——备忘录模式(Memento 模式)

    文章目录 前言 一.备忘录模式(Memento 模式) 二.具体源码 1.Memento.h 2.Subject.cpp 3.main.cpp 三.运行结果 总结 前言 备忘录模式用于保存和恢复对象的 ...

  2. 行为模式之Memento模式

    1.意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. 2.适用性 (1)必须保存一个对象在某一个时刻的状态,这样以后需要时它 ...

  3. Memento 模式

    Memento 模式 使用Memento模式可以实现应用程序的以下功能. Undo(撤销) Redo(重做) History(历史记录) Snapshot(快照) Memento模式事先将某个时间点的 ...

  4. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  5. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  6. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  7. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  8. memento模式_Java中的Memento设计模式

    memento模式 Memento design pattern is one of the behavioral design pattern. Memento design pattern is ...

  9. 设计模式(行为型模式)——备忘录模式(Memento)

    2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...

最新文章

  1. Hibernate---进度1
  2. 【Spring】Spring MVC文件上传--整合bootstrap-fileinput和jQuery-File-Upload
  3. mysql 亿级_mysql 亿级数据量 ( sum ,group by )的优化
  4. Nginx安装手冊以及图片server部署
  5. C语言中open与fopen的的解释和区别
  6. background-image使用svg如何改变颜色
  7. iphone主屏幕动态壁纸_iPhone8怎么设置动态壁纸?iPhone8动态壁纸设置教程
  8. reset java_Java PushbackReader reset()用法及代码示例
  9. 让Oracle跑得更快2—基于海量数据的数据库设计与优化
  10. PyTorch:tensor-数据处理
  11. 从零基础入门Tensorflow2.0 ----一、3.3 实战深度神经网络(激活函数)
  12. 文件或目录损坏且无法读取怎么删除文件或目录
  13. 自动驾驶最全基础知识、课程、论文、数据集、开源软件等资源整理分享
  14. 极坐标可以用计算机吗,极坐标(怎么用计算器计算极坐标)
  15. 【PyTorch教程】P30 GPU加速
  16. 计算机绘制表格教案,电脑制作表格教案设计
  17. [Android]Tablayout:修改指示器indicator的宽度
  18. 19款国产手机无一幸免:15分钟破解人脸识别,打印眼镜让刷脸形同虚设 ?
  19. oracle sqlnet配置,sqlnet.ora文件配置详解
  20. DHCPV4 VS DHCPV6

热门文章

  1. 集合框架源码分析四(Collections类详细分析)
  2. 第三篇 :Mysql存储引擎、数据导入导出、管理表记录、匹配条件
  3. 苹果手机微信声音小怎么调大声_成都市苹果手机维修服务网点查询
  4. oracle 48小时内_恭喜詹姆斯!恭喜湖人!戴维斯续约最新动态:48小时内或达成...
  5. excel公式 某一个单元格等于另一个单元格的值_15个excel小技巧,简单易学,一看就会,收藏备用吧...
  6. php账号密码备忘,WordPress使用备忘
  7. 5 java中的集合类_java基础(5)-集合类1
  8. 泛珠三角计算机作品大赛2018,2018年泛珠三角大学生计算机作品赛广西赛区选拔赛圆满结束...
  9. 记一次Linux修改MySQL配置不生效的问题
  10. Linux使用storcli工具查看服务器硬盘和raid组信息