Java设计模式----备忘录模式(Memento)_java备忘录模式实例-程序员宅基地

技术标签: 备忘录模式  Memento  Java设计模式  Java常用设计模式  

1.  备忘录模式的定义:

      在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先的状态。通俗的说,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法。

2.  备忘录模式的3个角色:

    a、 Originator 角色类(发起人)

     记录当前时刻的内部状态,负责定义那些事属于备份范围的状态,负责创建和恢复备忘录数据

   b、 Memento 角色类(备忘录)

     负责保存发起人对象的内部状态,在适当的时候提供发起人所需要的内部状态

   c、 MementoManager角色类 (备忘录管理类)

     对备忘录进行管理、保存,并提供备忘录

3. 备忘录模式的通用代码(多状态备份)

 Originator 角色类(在bean与map之间转换的时候使用的Apache的BeanUtils包提供的转换方法)

/**
 * 发起者类(持有被备份数据类)
 * @author zqkj001
 *
 */
public class Originator {
    
	//内部状态
	private String  province;
	private String  city;
	private String  postCode;
	
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getPostCode() {
		return postCode;
	}
	public void setPostCode(String postCode) {
		this.postCode = postCode;
	}
	
	//创建一个备忘录
	public Memento createMemento(){
		try {
			return new Memento(BeanUtils.describe(this));
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//从备忘录回复
	public void  backFromMemento(Memento memento){
		try {
			BeanUtils.populate(this, memento.getHashMap());
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	
	
	@Override
	public String toString() {
		return "Originator [province=" + province + ", city=" + city + ", postCode=" + postCode + "]";
	}
			
}
Memento 角色类(备忘录)

/**
 * 备忘者角色类
 * @author zqkj001
 *
 */
public class Memento {
   
	private Map<String, String> hashMap;

	public Memento(Map<String, String> map) {
		   this.hashMap=map;
	}
	
	public Map<String, String> getHashMap() {
		   return hashMap;
	}

	public void setHashMap(Map<String, String> hashMap) {
		   this.hashMap = hashMap;
	}
		
}
 MementoManager角色类 (备忘录管理类)

/**
 * 备忘录管理类
 * @author zqkj001
 *
 */
public class MementoManager {
   
	private HashMap<String,Memento> meMap=new HashMap<String,Memento>();
	
	public Memento getMemento(String id){
		return this.meMap.get(id);
	}
	
	public void setMemento(String id,Memento me){
		this.meMap.put(id, me);
	}
}
测试类:

public class Test {
   
	public static void main(String[] args) {
		
		//定义发起人
		Originator originator=new Originator();
		//设置发起人的状态
		originator.setProvince("江苏省");
		originator.setCity("常州市");
		originator.setPostCode("213000");
		System.out.println("-------原始状态------");
		System.out.println(originator.toString());
		
		//定义备忘录管理类
		MementoManager mm=new MementoManager();
		//创建一个发起人备份
		Memento memento=originator.createMemento();
		//将备份数据保存到备忘录管理对象中
		mm.setMemento("001", memento);
		mm.setMemento("002", memento);
		
		//修改状态
		originator.setProvince("浙江省");
		originator.setCity("杭州市");
		originator.setPostCode("333000");
		System.out.println("-------修改后的状态------");
		System.out.println(originator.toString());
		
		//从备份回复原始状态
		originator.backFromMemento(mm.getMemento("001"));
		System.out.println("-------恢复后的状态------");
		System.out.println(originator.toString());
	}
}
运行结果:

-------原始状态------
Originator [province=江苏省, city=常州市, postCode=213000]
-------修改后的状态------
Originator [province=浙江省, city=杭州市, postCode=333000]
-------恢复后的状态------
Originator [province=江苏省, city=常州市, postCode=213000]
4.  备忘录模式的注意事项

● 备忘录的生命期

备忘录创建出来就要在“最近”的代码中使用,要主动管理它的生命周期,建立就要使用,不使用就要立刻删除其引用,等待垃圾回收器对它的回收处理。

● 备忘录的性能

不要在频繁建立备份的场景中使用备忘录模式(比如一个for循环中),原因有二:一是控制不了备忘录建立的对象数量;二是大量对象的建立是要消耗资源的,系统的性能需要考虑。







版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kris234seth/article/details/49662539

智能推荐

R 语言怎么保存工作目录到当前路径_C语言探索之旅 | 第二部分第七课:文件读写...-程序员宅基地

文章浏览阅读215次。内容简介前言文件的打开和关闭读写文件的不同方法在文件中移动文件的重命名和删除第二部分第八课预告1. 前言上一课 C语言探索之旅 | 第二部分第六课:创建你自己的变量类型 之后,我们来学习很常用的文件读写。我们学过了这么多变量的知识,已经知道变量实在是很强大的,可以帮助我们实现很多事情。变量固然强大,还是有缺陷的,最大的缺陷就是:不能永久保存。因为 C语言的变量储存在内存中,在你的程序退出..._怎么将txt文件保存在r工作环境所在的目录下

servlet-3_0-final-spec-程序员宅基地

文章浏览阅读118次。<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://java.sun.com/xml/ns/j2ee" xmlns:j2ee="http://java..._servlet-3_0 final-spec 中文版

lua函数之rawget和rawset_lua rewget-程序员宅基地

文章浏览阅读1.6k次。lua函数之rawget和rawset的应用_lua rewget

课下作业:每个人评价一下大家手头正在使用输入法或者搜索类的软件产品,从用户界面、记住用户选择、短期刺激、长期使用的好处坏处、不要让用户犯简单的错误四个方面发表一篇博客。...-程序员宅基地

文章浏览阅读85次。我对所使用的“搜狗输入法”的看法:  用户界面:1、界面简约精美,可切换风格皮肤,给用户较好的外观体验。        2、不使用的时候自动隐藏,较好的迎合用户的主要操作。  记住用户选择:输入法皮肤的使用、中英文切换。  短期刺激:打字时弹出的界面有特效,看起来很好。  长期使用的好处坏处:长期使用时能记录用户的常用字或词,特别方便。  不要让用户犯简单的错误:有词的自动..._每个人评价一下大家手头正在使用输入法或者搜索类的软件产品。 从用户界面、记住

福岛核泄漏必然性的分析_福岛核泄漏事故原因-程序员宅基地

文章浏览阅读3.2k次。 我作为一个核专业的专业,就给大家简单的说明一下,福岛核电站泄漏事故固然有天灾的缘故,但其背后隐藏着人为设计缺陷的必然性。 一、日本处于环太平洋火山带上,是一个地震高发国家。福岛核电站就位于地震带上。而我国核电站已充分考虑了地质结构的稳定性要求,同时考虑了海啸的影响。  二、福岛核电站在全部失去场内外电源的情况下,就会失去堆芯冷却的全部功能。而我国建设的压水堆核电站即使失去全部厂内外电源,也能通过自带的气动给水泵和蒸汽排放的形式维持对堆芯的冷却。  三、福岛核电站没有安全壳。虽然在200_福岛核泄漏事故原因

ONVIF 测试工具使用方法_onvif扫描工具-程序员宅基地

文章浏览阅读4.5k次。1 工具下载测试工具使用ONVIF Device Test Tool,具体下载地址可自行百度,一路默认安装即可。2 相机配置我使用的海康球机型号为DS-2DE2402IW-DE3/W,默认是没有打开ONVIF协议的,需要我们在配置中进行配置进入海康相机设置平台,选择配置-高级配置-勾选启用ONVIF-添加用户-输入登陆用户名和密码-保存以上即可完成相机ONVIF的相关配置3 连接设备..._onvif扫描工具

随便推点

17. 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据_sap odata expand 方法debug-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏2次。这些模型增强是在 ABAP 服务器的事物码SEGW里完成的。我们在 SEGW 里创建了Authors这个 Navigation Properties,它通过名为BookAuthor的 Relationship,依据 Book 和 Author 两个 Entity Type 的book_guid字段,描述了这两个节点间的导航关系,即通过一个 Book 实例,我们期望通过$expand操作,读取到其所有的 Authors 数据:其中绿色的位于$expand=_sap odata expand 方法debug

zint | 一个开源的条码二维码生成库和生成工具-程序员宅基地

文章浏览阅读2k次。一、zint1. 介绍Zint是一个软件,允许在任何广泛的公共领域条形码标准中轻松编码数据,并允许将这种功能集成到您自己的程序中。Zint项目的目标是提供一个完全跨平台的开源条形码生成解决方案,目前包含了:一个基于Qt的基础GUI一个命令行工具一个允许用户调用API使用Zint的库2. 下载zint在github的仓库地址为:https://github.com/zint..._zint库

Mac os搭建Arduino IDE开发STM32F1系列芯片_macbookpro stm32f1-程序员宅基地

文章浏览阅读880次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma..._macbookpro stm32f1

Qt简介 及与MFC、GDK+的比较-程序员宅基地

文章浏览阅读572次。Qt  C++图形用户界面应用程序开发框架。Qt的由来和发展  1、QT由来  Haavard Nord 和Eirik Chambe-Eng于1991年开始开发"Qt",1994年3月4日创立公司,早名为Quasar Technologies,然后更名为Troll Tech,然后在改为Trolltech,中文名是“奇趣科技”。2008年6月17日被NOKIA公司收购,以增强该..._qt gdk

process address space-程序员宅基地

文章浏览阅读149次。[img]http://dl.iteye.com/upload/attachment/439950/70a7638d-3ef9-33e7-b392-a8bcfe7b60ad.png[/img]_process addresss space

Kubernetes基础4_dashboard-metrics-scraper-7f7574cd55-9l8jc" is wai-程序员宅基地

文章浏览阅读1.9k次。1.HPA控制器简介1 方式1:手动调整pod数量,通过kubectl scale命令临时修改方式,不会持久保存查看pod 数量root@master1:~# kubectl get pod -A -o widens-uat uat-tomcat-app1-deployment-677fcd9d44-jxmfm 1/1 Running 4 5d10h 10.20.2.57 172.16.62.20_dashboard-metrics-scraper-7f7574cd55-9l8jc" is waiting to start: trying and

推荐文章

热门文章

相关标签