memento模式

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

Memento模式通过两个对象实现-Originator和Caretaker 。 发起者是需要保存和恢复其状态的对象,并且它使用内部类来保存对象的状态。 内部类称为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();

}

@Override

public 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 object

this.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 file

caretaker.save(fileWriter);

//now write something else

fileWriter.write("Second Set of Data\n");

//checking file contents

System.out.println(fileWriter+"\n\n");

//lets undo to last save

caretaker.undo(fileWriter);

//checking file content again

System.out.println(fileWriter+"\n\n");

}

}

上面程序的输出是:

First Set of Data

First Set of Data

Second Set of Data

First 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

memento模式

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

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

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

  2. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程

    java设计模式迭代器模式 迭代器模式是一种行为模式,它用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator ...

  3. Java中的Memento设计模式-示例教程

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

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

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

  5. java命令模式_Java中的命令设计模式

    java命令模式 在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象 ...

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

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

  7. java 设计模式 示例_Java中的访问者设计模式–示例教程

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

  8. java 观察者模式示例_Java中的观察者设计模式-示例教程

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

  9. java 设计模式 示例_Java中的策略设计模式-示例教程

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

最新文章

  1. .NET读写Excel工具Spire.Xls使用(1)入门介绍
  2. DevExpress的下拉框控件LookUpEdit的使用、添加item选项值、修改默认显示值
  3. [OS复习]虚拟存储管理技术2
  4. martin fowler_用Java和Java 8创建内部DSL,采用Martin Fowler的方法
  5. 初步使用github,并上传下载文件
  6. pycharm安装javascript插件_IDEA必备插件系列-Rainbow
  7. 设计资源类网站|日常必逛设计导航
  8. deepin启动盘无法引导安装_通过Deepin系统的安装U盘来修复启动引导:可解决大部分启动引导问题...
  9. 第七节、文件系统与磁盘分区
  10. 用户·角色·权限·表
  11. 零基础使用Xmind
  12. kartoslam找bug之行
  13. 我闺蜜她男朋友要我用Python写个脚本,每天不同时间段用微信给闺蜜发消息
  14. 销售小姐姐再也不用担心写错合同编号了
  15. SQL Server笔记心得(持续更新)
  16. mysql 5.5 slow log_mysql5.5开启慢日志slowlog的方法(log_slow_queries)_MySQL
  17. http协议抓包工具
  18. 什么是Google Voice
  19. 网络营销与推广手法探秘
  20. 周志华 AdaBoost报告总结

热门文章

  1. 算法分析与设计——贪心法实验报告
  2. 面向对象及三大特征讲解(图文)
  3. 文件批量下载方法 文件批量下载工具
  4. 为什么要选三翼鸟?因为它能一站式定制智慧家
  5. 【c++】简单了解并行计算库PPL
  6. 数据载入及初步观察 + 探索性数据分析 —— 泰坦尼克任务
  7. RHCSA学习第二天
  8. 记一次p2v转换报错解决
  9. 第十四周项目二成绩姓名排名
  10. sftp没有关闭session导致服务器sshd进程未关闭