备忘录模式(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类图