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

memento模式

记忆模式行为设计模式之一 。 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式。 使用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

memento模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界(泛型的协变) 4.通配符下界(泛型的逆变) 5.泛型的编译(擦除机制) 泛型 泛型:就是让一个类能适用于多个类型,就是在封装数据结…

Python实验三:Python程序设计之组合数据类型

微信公众号:创享日记 发送:python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习…

MATLAB成形滤波、信号过信道

function [y, t] = rcosflt(x, Fd, Fs, type_flag, R, Delay, tol) 根升余弦滤波器 h = rcosdesign(alpha,6,Fs/RB,sqrt); % 根升余弦成形 h1 = rcosine(RB,Fs,fir/sqrt,alpha)

Java 10及更高版本的思考

大家好 Java 10于2018年3月20日发布。我认为许多软件团队将阻止升级。 从Java 8到Java 9的专业人员人数可能还更少。为什么会这样,原因是传统的障碍以及对应用程序服务器,框架甚至是云原生容器的依赖。 例如,如果您正在等待Spring Boot 2.0支…

Python爬虫和数据分析,石油原油加工产品产量数据处理分析

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:原油分析 获取完整无水印报告P…

基于线性调频(LFM)信号分数阶傅里叶变换的多径时延估计

仿真信号 仿真信号为线性调频信号,信号采样率为2kHz。 线性调频(LFM)信号参数为:初始频率为300Hz,带宽400Hz,脉宽1s,调频斜率为 k ^ = − F s Δ t c o t ( p 0 ⋅ π 2 ) \hat

Python实验二:Python程序设计之结构与复用

微信公众号:创享日记 发送:python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习…

基于x86汇编的飞机大战

运行结果 代码 ;宏定义一个显示函数(显示一组字符串) PUTS MACRO STRINGPUSH AXPUSH DXLEA DX, STRING ;LEA将内存地址的

Python实验四:Python程序设计之文件

微信公众号:创享日记 发送:python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习…

【OFDM系列1】OFDM调制原理、参数、循环前缀、采样偏差、频偏及估计详解

关注公号【逆向通信猿】回复【OFDM】更精彩!!! OFDM调制解调原理 星座映射==>插入导频==>IFFT调制==>插入CP==>定时==>FFT解调==>导频均衡==>判决恢复 OFDM的正交条件[樊昌信,通信原理]: ①子载波 f k = k 2 T f_k=\frac{k}{2T}

Python统计英文单词出现情况次数实验

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 一、题目 请统计附件hamlet.txt中出现的英文单词情况,统计并输出出现…

Java EE 8安全性API:概述

新的安全性API 可能,添加到Java EE 8中最重要的一项新功能就是新的安全性API。 此新API的主要动机是简化,标准化和现代化跨容器和实现处理安全性问题的方式。 他们做得很好。 由于三个新的注释使web.xml文件声明变得多余,Web身份验证的配置…

【OFDM系列2】OFDM复信号符号信噪比EsN0、比特信噪比EbN0、SNR的含义及关系详解

更基础的各类信噪比的关系请看博客 【干货2020.12.13更新】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解 本文只讨论OFDM复信号的信噪比关系。 各个参数变量不作赘述,同上一篇博客,直接推 由 E s N 0 = E b ⋅ M N / B n

基于SSH的校园网上购物系统Javaweb、MySQL、JSP

微信公众号:创享日记 发送:校园购物 获取完整论文报告项目Java和SQL源码源文件答辩PPT等 主要内容: 1.对校园网上购物平台的建设需求进行分析,包括产品、服务方式等。 2.按需求对各个功能模块进行设计。 3&…

FSK、PSK基带信号高阶累积量理论值

高阶累积量计算公式 M p q = E { X p − q ( t ) [ X ∗ (

Python传感器采集数据文件分析处理实验源码

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 一、题目 附件sensor-data.txt是一个传感器采集数据文件,其中&#…

Java Stream ORM现在带有JOIN

Speedment是一个Java Stream ORM工具包和运行时,它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL,因此该应用程序变得更加紧凑,从而使其开发速度更快,更不容易出错并且更易于维护。 流也严格地是类型安…

【自适应(盲)均衡5】分数间隔均衡器基本原理及应用(更正数字通信翻译版中公式错误)

关注公号【逆向通信猿】有惊喜!!! 摘要:本文在大量阅读国内外关于分数间隔均衡器(Fractionally-Spaced Equalizer, FSE)的文献基础上,理解并掌握了分数间隔均衡器的基本原理,以及相对于符号间隔均衡器的优点。通过阅读文献对分数间隔均衡器收敛特性等性能进行了分析,…

易购数码类电商商城网页设计与实现项目源码

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:易购网站 获取完整报告论文源…

Python定义一个单链表可判断是否为空,计算长度,插入节结点实验

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 一、题目 使用python定义一个单链表,并实现以下功能: (…