备忘录模式

备忘录模式(Memento pattern)
核心

保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态

结构

1:源发器类(Originator)

2:备忘录类(Memento)

3:负责人类(CareTake)

优化

当备忘录较多时

                        1:可以通过增加容器,设置多个“备忘点”

                        2:将备忘录压栈

                        3:将多个备忘录对象,序列化持久化

应用场景

1:录入大量人员资料,正在录入当前人员资料时,发现上一个人录错了,此时需要恢复上一个人的资料,再进行修改

2:Word文档编辑时,忽然电脑死机断电,再打开时,可以看到word提示你恢复到以前的文档

3:管理系统中,公文撤回功能。公文发送出去后,想撤回来

开发场景
1:棋类游戏中悔棋
2:普通软件中撤销
3:数据库软件中,事务管理中的回滚操作
4:Photoshop软件中的历史记录
案例(录入员工信息)

员工类(源发器类

/*
 * 源发器类
 */
public class Employee {
	private String name;
	private int age;
	private double salary;
	
	//进行备忘操作,并返回备忘录对象
	public EmployeeMemento memento(){
		return new EmployeeMemento(this);
	}
	
	//进行数据恢复,恢复成制定备忘录对象的值
	public void recovery(EmployeeMemento e){
		this.name = e.getName();
		this.age = e.getAge();
		this.salary = e.getSalary();
	}
	
	public Employee(String name, int age, double salary) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	
	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;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
}

备忘录类

/*
 * 备忘录类
 */
public class EmployeeMemento {
	private String name;
	private int age;
	private double salary;
	
	public EmployeeMemento(Employee e) {
		this.name = e.getName();
		this.age = e.getAge();
		this.salary = e.getSalary();
	}
	
	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;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
}

负责人类

/*
 * 负责人类,负责管理备忘录对象
 */
public class CareTaker {
	private EmployeeMemento memento;

	public EmployeeMemento getMemento() {
		return memento;
	}

	public void setMemento(EmployeeMemento memento) {
		this.memento = memento;
	}
	
}

客户端测试

public class Client {
	public static void main(String[] args) {
		CareTaker taker = new CareTaker();
		Employee employee = new Employee("mark", 24, 5000);
		System.out.println("第一次打印对象:" + employee.getName() + "---" + employee.getAge() + "---" + 
		employee.getSalary());
		
		//备忘一次
		taker.setMemento(employee.memento());  
		
		//修改员工内容
		employee.setName("jek");
		employee.setAge(15);
		employee.setSalary(6000);
		System.out.println("第二次打印对象:" + employee.getName() + "---" + employee.getAge() + "---" + 
		employee.getSalary());
		
		//恢复备忘录
		employee.recovery(taker.getMemento());
		System.out.println("第三次打印对象:" + employee.getName() + "---" + employee.getAge() + "---" + 
		employee.getSalary());
	}
}


console:
第一次打印对象:mark---24---5000.0
第二次打印对象:jek---15---6000.0
第三次打印对象:mark---24---5000.0

UML类图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值