设计模式笔记之九备忘录模式

备忘录模式

为什么引入备忘录模式

在我们的生活中,不可能一番风顺,也会犯错,但是如果可以向word那样,做错了就撤销,回到原来的样子,那就更棒了,又例如数据库,当数据库被破坏,我们通常的做法是从日志中找出原因,如果可以进行恢复,更好,如果不能恢复,我们会将以前备份的数据库迁移过来,然后从数据库日志中查看接下来要执行什么事务,来尽可能的恢复到原来的数据库,在这两种情况下,我们都需要回到事物原来的某个时刻的状态,这就需要备忘录模式。

备忘录模式是什么

再不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

核心思想

在目标类内部创建备份,有一个备份类用于记录目标类的状态,备份管理类则用于得到和设置备份类。

具体案例

时光倒流,遇到18岁的你,使用备忘录模式,

UML

代码

package com.dong.MementoM;

public class Human {
	
	private String name;
	private int age;
	
	public Human(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	//进行备份
	public Memento saveTime() {
		return new Memento(this.name,this.age);
	}
	//从备份中获取对象属性,进行赋值
	public void TimeReturn(Memento p) {
		this.name = p.getName();
		this.age = p.getAge();
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Human [name=" + name + ", age=" + age + "]";
	}
}

package com.dong.MementoM;

public class Memento {
	
	private String name;
	private int age;
	
	public Memento(String name, int age) {
		this.name = name;
		this.age = age;
	}	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}		
}	

package com.dong.MementoM;

public class MementoCareTaker {
	
	private Memento memento ;

	public Memento getMemento() {
		return memento;
	}
	public void setMemento(Memento memento) {
		this.memento = memento;
	}		
}

package com.dong.MementoM;
/**
 *  Human [name=DL, age=17]
	一年后
	Human [name=DL, age=18]
	两年后
	Human [name=DL, age=20]
	回到18岁
	Human [name=DL, age=18]
 * @author liuD
 */
public class client {
	public static void main(String[] args) throws InterruptedException {
		MementoCareTaker mct = new MementoCareTaker();
		Human human = new Human("DL", 17);
		System.out.println(human);
		System.out.println("一年后");
		Thread.sleep(1000);
		human.setAge(18);
		System.out.println(human);
		mct.setMemento(human.saveTime());
		System.out.println("两年后");
		Thread.sleep(2000);
		human.setAge(20);
		System.out.println(human.toString());
		System.out.println("回到18岁");
		human.TimeReturn(mct.getMemento());
		System.out.println(human.toString());
	}
}

优点

从结构中可以看到类与类之间的低耦合,各司其职,管理明确,

扩展:

多备份备录模式:

在备忘录管理者类中使用HashMap记录目标的多个状态,

部分修改代码:

package com.dong.MementoM;

import java.util.HashMap;

public class MementoCareTaker {

	private HashMap<String,Memento> memMap = new HashMap<String,Memento>();
	
	public Memento getMemento(String id) {
		return memMap.get(id);
	}
	public void setMemento(String id,Memento memento) {
		memMap.put(id, memento);
	}
}

package com.dong.MementoM;
/**
Human [name=DL, age=17]
一年后
Human [name=DL, age=18]
两年后
Human [name=DL, age=20]
回到18岁
Human [name=DL, age=18]
回到20岁
Human [name=DL, age=20]
 * @author liuD
 */
public class client {
	public static void main(String[] args) throws InterruptedException {
		MementoCareTaker mct = new MementoCareTaker();
		Human human = new Human("DL", 17);
		System.out.println(human);
		System.out.println("一年后");
		Thread.sleep(1000);
		human.setAge(18);
		System.out.println(human);
		mct.setMemento("001" ,human.saveTime());
		System.out.println("两年后");
		Thread.sleep(2000);
		human.setAge(20);
		mct.setMemento("002" ,human.saveTime());
		System.out.println(human.toString());
		System.out.println("回到18岁");
		human.TimeReturn(mct.getMemento("001"));
		System.out.println(human.toString());
		System.out.println("回到20岁");
		human.TimeReturn(mct.getMemento("002"));
		System.out.println(human.toString());	
	}
}


 

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 、3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 、本项3目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值