原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。

备忘录模式(Memento Pattern)(本文大部分摘自原文)
保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

意图:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

主要解决:
所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用:
很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有”后悔药”可吃。

如何解决:
通过一个备忘录类专门存储对象状态。

关键代码:
客户不与备忘录类耦合,与备忘录管理类耦合。

类比现实:
1、后悔药。
2、打游戏时的存档。
3、Windows 里的 ctri + z。
4、IE 中的后退。
4、数据库的事务管理。

优点:
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景:
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。

注意事项:
1、为了符合迪米特原则,还要增加一个管理备忘录的类。
2、为了节约内存,可使用原型模式+备忘录模式。

代码实现
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。

备忘录模式的 UML 图

步骤 1
创建 Memento 类。
Memento.java
//状态存储地

public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}

步骤 2
创建 Originator 类。
Originator.java

//存储方法所在
//获取或者保存Memento的数据
public class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveStateToMemento() {return new Memento(state);}public void getStateFromMemento(Memento Memento) {state = Memento.getState();}
}

步骤 3
创建 CareTaker 类。
CareTaker.java

import java.util.ArrayList;
import java.util.List;//恢复数据
public class CareTaker {private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento state) {mementoList.add(state);}public List<Memento> getMementoList(){return mementoList;}public Memento get(int index) {return mementoList.get(index);}
}

步骤 4
使用 CareTaker 和 Originator 对象。
MementoPatternDemo.java

public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();CareTaker careTaker = new CareTaker();originator.setState("state 1");careTaker.add(originator.saveStateToMemento());originator.setState("state 2");careTaker.add(originator.saveStateToMemento());originator.setState("state 3");
//      careTaker.add(originator.saveStateToMemento());originator.setState("state 4");careTaker.add(originator.saveStateToMemento());for(Memento memento : careTaker.getMementoList()){System.out.println(memento.getState());}}
}

步骤 5
验证输出。

state 1
state 2
state 4

设计模式笔记十九:备忘录模式相关推荐

  1. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  2. (原创)无废话C#设计模式之十九:Observer

    无废话C#设计模式之十九:Observer 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 场景 这次不说游戏了,假设我们需要在一个W ...

  3. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

  4. 云计算设计模式(十)——守门员模式

    云计算设计模式(十)--守门员模式 通过使用充当客户端和应用程序或服务之间的代理,验证和进行消毒的请求,并将它们之间的请求和数据的专用主机实例保护的应用程序和服务.这可以提供一个额外的安全层,并限制了 ...

  5. 设计模式(十九)—— 备忘录模式

    模式简介 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 很多时候我们要记录一个对象的内部状态,为了允许用户撤销不确定的操作或从 ...

  6. 【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码

    本文是以下几篇文章对应的动态加载的用户程序/任务一代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 ...

  7. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码

    本汇编代码对应以下两篇文章对应的用户程序汇编代码: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中 ...

  8. 从王者荣耀看设计模式(二十二.备忘录模式)

    从王者荣耀看设计模式 一.简介 点击王者荣耀商店法术的装备栏,存在有"贤者的庇护"这一装备.在对战中,当玩家处于死亡状态时,会触发此装备的效果,能够让英雄重新复活. ┬┴┬┌─ ● ...

  9. Java笔记-Java中备忘录模式

    首先设计模式代表外招功法,是外招的模板,个人觉得他是为面向对象7个原则而准备的: 面向对象程序设计要考虑7个原则: 单一职责原则:设计目的单一的类: 开放封闭原则:对扩展开发,对修改封闭: 李氏替换原 ...

最新文章

  1. 一个httpwebrequest异步下载的例子
  2. express细节点注意
  3. Zuul:路由转发,排除和自定义
  4. oracle 长事务 逻辑日志,goldengate中长事务引起的问题
  5. python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...
  6. 使用函数计算打包下载OSS文件
  7. 自定义---单批次训练函数
  8. TimeUnit类中的sleep() 和Thread.sleep()
  9. Lan Xiang's Square nyoj 1099(已经四边形四点坐标 如何判断正方形)
  10. 极光推送JPush使用Java SDK开发
  11. photoshop插件开发
  12. vue分享至qq空间,新浪微博,微信朋友圈及微信好友
  13. 查找整数c语言程序,查找整数(示例代码)
  14. 智能优化算法:海鸥算法原理及Matlab代码
  15. 深度学习之目标检测--Pytorch实战
  16. 编程入门先学哪种语言好
  17. 密码学基础-AES加解密Python代码实现
  18. 手机一个2k屏60hz,一个1080p屏90hz,哪个好呀?
  19. 可汗学院 统计学习第一天
  20. mac强制退出程序的几种方法

热门文章

  1. group by两个条件
  2. Luogu P1311 选择客栈(前缀和)
  3. 我在使用vector时候遇到的二逼问题
  4. xcode4.5 iOS6 cocos2d-x 横屏解决方案
  5. ASP.net 省市级联(用户控件)适用用framework3.5以上版本
  6. 宏定义 是否retina高清屏,判断当前设备
  7. EntLib 3.1学习笔记(2) : Data Access Application Block
  8. 达内android 代码,深圳达内Android网页源码查看器.pdf
  9. 复习:顺序表——链表
  10. 数据 3 分钟 | 《数据安全法》即将施行;ACM SIGMOD在西安举办;艾瑞咨询发布数据库行业报告...