记忆模式行为设计模式之一 。 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式。 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保存状态数据的完整性。

Memento模式通过两个对象实现-OriginatorCaretaker 。 发起者是需要保存和恢复其状态的对象,并且它使用内部类来保存对象的状态。 内部类称为Memento及其私有类,因此无法从其他对象访问它。

Caretaker是帮助程序类,负责通过Memento对象存储和还原发起者的状态。 由于Memento对发起者是私有的,因此看守者无法访问它,并且将其作为对象存储在看守者中。

现实生活中最好的示例之一是文本编辑器,我们可以在其中随时保存其数据,并使用undo将其还原到以前的保存状态。 我们将实现相同的功能,并提供一个实用程序,使我们可以随时将内容写入并保存到文件中,并将其恢复到上次保存的状态。 为简单起见,我将不使用任何IO操作将数据写入文件。

发起者类

package com.journaldev.design.memento;public class FileWriterUtil {private String fileName;private StringBuilder content;public FileWriterUtil(String file){this.fileName=file;this.content=new StringBuilder();}@Overridepublic String toString(){return this.content.toString();}public void write(String str){content.append(str);}public Memento save(){return new Memento(this.fileName,this.content);}public void undoToLastSave(Object obj){Memento memento = (Memento) obj;this.fileName= memento.fileName;this.content=memento.content;}private class Memento{private String fileName;private StringBuilder content;public Memento(String file, StringBuilder content){this.fileName=file;//notice the deep copy so that Memento and FileWriterUtil content variables don't refer to same objectthis.content=new StringBuilder(content);}}
}

注意Memento内部类以及save和undo方法的实现。 现在,我们可以继续实施看守类。

看守班

package com.journaldev.design.memento;public class FileWriterCaretaker {private Object obj;public void save(FileWriterUtil fileWriter){this.obj=fileWriter.save();}public void undo(FileWriterUtil fileWriter){fileWriter.undoToLastSave(obj);}
}

请注意,看守对象包含对象形式的已保存状态,因此它无法更改其数据,也不知道其结构。

纪念品测试班

让我们编写一个简单的测试程序,该程序将使用我们的memento实现。

package com.journaldev.design.memento;public class FileWriterClient {public static void main(String[] args) {FileWriterCaretaker caretaker = new FileWriterCaretaker();FileWriterUtil fileWriter = new FileWriterUtil("data.txt");fileWriter.write("First Set of Data\n");System.out.println(fileWriter+"\n\n");// lets save the filecaretaker.save(fileWriter);//now write something elsefileWriter.write("Second Set of Data\n");//checking file contentsSystem.out.println(fileWriter+"\n\n");//lets undo to last savecaretaker.undo(fileWriter);//checking file content againSystem.out.println(fileWriter+"\n\n");}}

上面程序的输出是:

First Set of DataFirst Set of Data
Second Set of DataFirst Set of Data

该模式简单且易于实现,需要注意的一件事是Memento类应仅对Originator对象可访问。 同样在客户端应用程序中,我们应该使用看守对象来保存和还原发起者状态。

同样,如果Originator对象具有不可变的属性,我们应该使用深层复制或克隆来避免数据完整性问题,就像我在上面的示例中使用的那样。 我们可以使用序列化来实现更通用的memento模式实现,而不是Memento模式实现,因为每个对象都需要拥有自己的Memento类实现。

缺点之一是,如果Originator对象非常大,那么Memento对象的大小也会很大,并占用大量内存。

参考: Java中的Memento设计模式-我们的JCG合作伙伴 Pankaj Kumar在开发人员食谱博客上的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/memento-design-pattern-in-java-example-tutorial.html

Java中的Memento设计模式-示例教程相关推荐

  1. java memento_memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

  2. memento模式_Java中的Memento设计模式-示例教程

    memento模式 记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已 ...

  3. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  4. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  5. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  6. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

  7. Java中的观察者设计模式-示例教程

    观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为S ...

  8. Java依赖注入 - DI设计模式示例教程

    Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...

  9. java 设计模式 示例_Java中的状态设计模式–示例教程

    java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...

最新文章

  1. 如何测量智能产品的AI智商水平,论AI的三种智商 |未来研究
  2. excel 进行二叉树_基础扩展 | 21. 遍历二叉树
  3. File,FileInputStream,FileReader,InputStreamReader,BufferReader 的区别使用
  4. 第三次学JAVA再学不好就吃翔(part54)--StringBuffer类的添加功能
  5. 如何为 Drupal 添加简单的 SEO META 标签(title keywords des...
  6. 编程模式如何结束未响应的程序
  7. 今晚直播丨国产数据库入门:openGauss数据库的基本管理和SQL语句入门
  8. 企业运维之域控篇(三)--加入域
  9. day47 Pyhton 数据库Mysql 04
  10. Microsoft.XMLHTTP“没有权限”的错误
  11. 五金件常见问题01——2.普通螺纹与管螺纹
  12. 转正述职报告 实习转正 工作汇报 述职模板免费下载_PPTX图片设计素材_包图网888pic.com...
  13. 计算机方面发什么类型的论文,计算机类本科毕业论文
  14. JPEG编码压缩率调整
  15. python scrapy第一弹--爬取好看的堆糖头像
  16. ubuntu中修改只读文件
  17. 都说学3D建模赚钱,到底学了能做什么?
  18. 操作系统-进程互斥的软件实现方法
  19. windows逻辑卷扩容_Windows 动态磁盘卷:简单卷、跨区卷 、带区卷 、镜像卷 、RAID5卷 相关配置操作介绍...
  20. 了解传统教育培训机构的痛点

热门文章

  1. 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)
  2. tomcat(8)载入器
  3. tomcat(1)一个简单的web server
  4. 打印结果和调试结果不一样(C语言)
  5. reactor使用方法_Project Reactor展开方法
  6. java nio教程_Java NIO教程
  7. drill apache_Apache Drill 1.4性能增强的简要概述
  8. java源文件编译成jar_从源文件和JAR文件构建Java代码模型
  9. netflix_学习Netflix管理员–第2部分
  10. java锁性能对比_提高Java的锁性能