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

最新文章

  1. 每天一个 Linux 命令(8):cp 命令
  2. postgresql 函数demo
  3. Prevent Adding Component More than once
  4. crackme_zapline分析
  5. protobuf 向前兼容向后兼容
  6. 原生JQ实现图片滑动轮播
  7. [Luogu P2296][NOIP 2014]寻找道路
  8. VMware Workstation 10序列号:
  9. 在try-catch机制优化IO流关闭时,OutputStreamWriter 数据流被截断
  10. Visual Studio编译时报错“函数名:重定义;不同的基类型”
  11. centos 安装oracle 11g r2(三)-----表空间创建
  12. jieba分词学习
  13. find中的-print0和xargs中-0的奥妙
  14. python计算结果显示小数
  15. 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
  16. (转)C#静态方法使用经验浅谈
  17. Linux操作系统文件系统基础知识详解
  18. Fuckey V1.0 Beta版发布!!!
  19. win10-MySql免安装版-安装/多实例
  20. C#封装StackExchange.Redis操作

热门文章

  1. 洛谷 P1881 绳子对折
  2. open阶段的一致性检验(二)
  3. 27.mutex跨进程通信
  4. IE中实现placeholder
  5. Java学习笔记五 常用API对象一
  6. JAVA MessageDigest(MD5加密等)
  7. Writing buffer overflow exploits - a tutorial for beginners
  8. 【Energy Forecasting】能源预測的发展和展望
  9. android:一个Open键引发的问题!!
  10. Project Euler 389 Platonic Dice (概率)