一、概述
        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象的外部保存这个状态。以便以后可以将该对象恢复到原先保存的状态。
二、适用性
1.当需要保存一个对象在某个时刻的状态(部分)的时候,以便需要时可以恢复到先前保存的状态。
2.当不愿意暴露对象的实现细节和破坏对象的封装性,又需要让其他对象得到该对象的状态的时候。   
三、参与者
1.Memento:备忘录。用于存储原发器对象的内部状态。
2.Originator:原发器。为原发器创建一个备忘录,用于记录当前时刻它的内部状态,以便日后使用备忘录恢复状态。
3.Caretaker:看守者。负责保存备忘录。不能对备忘录的内容进行操作或检查。
四、类图
五、示例
 
Memento
  1. package cn.lynn.memento;
  2. public class Memento {
  3. private String state;
  4. public Memento(String state) {
  5. this.state = state;
  6. }
  7. public String getState() {
  8. return state;
  9. }
  10. public void setState(String state) {
  11. this.state = state;
  12. }
  13. }

Originator

  1. package cn.lynn.memento;
  2. public class ConferenceRoom {
  3. private String state;
  4. public String getState() {
  5. return state;
  6. }
  7. public void setState(String state) {
  8. this.state = state;
  9. }
  10. public Memento createMemento() {
  11. return new Memento(state);
  12. }
  13. public void setMemento(Memento memento) {
  14. state = memento.getState();
  15. }
  16. public void showState() {
  17. System.out.println("会议室的状态:" + state);
  18. }
  19. }

Caretaker

  1. package cn.lynn.memento;
  2. public class Assistant {
  3. private Memento memento;
  4. public Memento getMemento() {
  5. return memento;
  6. }
  7. public void setMemento(Memento memento) {
  8. this.memento = memento;
  9. }
  10. }

Client

  1. package cn.lynn.memento;
  2. public class Client {
  3. public static void main(String[] args) {
  4. ConferenceRoom room = new ConferenceRoom();
  5. room.setState("开会中");
  6. Assistant assistant = new Assistant();
  7. // 助理将会议室处于开会状态的备忘录记录下来
  8. assistant.setMemento(room.createMemento());
  9. room.setState("休息中");
  10. room.showState();
  11. // 调用助理手中的那份关于会议室的备忘录
  12. room.setMemento(assistant.getMemento());
  13. room.showState();
  14. }
  15. }

Result

  1. 会议室的状态:休息中
  2. 会议室的状态:开会中

GoF23种设计模式之行为型模式之备忘录模式的更多相关文章

  1. GoF23种设计模式之行为型模式之状态模式

    一.概述         定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...

  2. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

  3. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  4. GoF23种设计模式之行为型模式之迭代器模式

    一.概述    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.二.适用性1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候.2.当对聚合对象的多 ...

  5. GoF23种设计模式之行为型模式之解释器模式

    一.概述         给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子. 二.适用性              当需要解释一种语言,并且可以将该语言中的句子表示 ...

  6. GoF23种设计模式之行为型模式之观察者模式

    一.概述        定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.二.适用性1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面的时 ...

  7. GoF23种设计模式之行为型模式之访问者模式

    概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依 ...

  8. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  9. GoF23种设计模式之创建型模式之抽象工厂模式

    一.概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 二.适用性 1.一个系统要独立于它的产品的创建.组合和表示的时候. 2.一个系统要由多个产品系列中的一个来配置的时候. ...

  10. GoF23种设计模式之创建型模式之建造者模式

    一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...

随机推荐

  1. G.点我

    链接:https://ac.nowcoder.com/acm/contest/903/G 题意: X腿与队友到河北省来参加2019河北省大学生程序设计竞赛,然而这场比赛的题目难度实在是太高了.比赛开始 ...

  2. [luogu 2634]聪聪可可

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  3. 微信android手机中点击大图片会自动放大图片

    自己使用的是微信Android客户端,使用img标签的src属性将图片设置好了以后,在微信中调试,点击图片竟然放大,自己没写放大图片的方法,也没有调用wx.previewImage()方法,最后查找, ...

  4. springIOC+Mysql+springmvc事务测试题总结

    1.关于http1.1和1.0的长连接和短连接 两个都支持长连接和短连接 http1.0默认为短连接,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接 http1.1 ...

  5. Java基础:(七)反射

    一.什么是反射 理解反射之前,先要搞懂一件事情,类加载到底是怎么一回事? 类加载相当于Class对象的加载.每个类都有一个Class对象,包含了与类有关的信息.当编译一个新类时,会产生一个同名的.cl ...

  6. FastDFS整合Nginx

    浏览器访问FastDFS存储的图片需要通过Nginx访问 需要安装fastdfs-nginx-module.Nginx 安装fastdfs-nginx-module模块 (1)将fastdfs-ngi ...

  7. Java中的Serializable接口和transient关键字

    Java中的Serializable接口和transient关键字 Table of Contents 1. 向memcached中放数据时遇到NotSerializableException异常 2 ...

  8. js push(),pop(),shift(),unshift()

    以前没有太在意这些,这几天看<Javascript 设计模式与开发实践>(不得不说这是一本好书) 发现总是会用到这几个函数,可是有什么区别呢?? 简单来说是两套东西(数据结构时老师详细的讲 ...

  9. 【Unity3D】实现太阳系

    实践要求:写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,并且不再一个法平面内. 法平面是指过空间曲线的切点,且与切线垂直的平面.要求不在一个法平面内,则在保证所有行星以及太阳在一 ...

  10. <Android 应用 之路> 简易贪吃蛇

    最简单的贪吃蛇 最近想着忙里偷闲写点简单的Android应用,增加一些生活乐趣,由于平时工作主要精力并不是集中在书写apk上,更多的是解决代码问题和维护模块稳定,但是写代码本身是一件比较有趣的事情,因 ...