场景
- word文档编辑,电脑断电或死机,再打开,提示恢复到以前的文档
- 微信消息或邮件系统中,消息、邮件撤回
- 棋类游戏中的悔棋
- 软件中的回退操作
- 数据库管理中,事务管理的回滚操作
核心
保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
结构
- 源发器类Originator
- 备忘录类Memento
- 负责人类CareTake
案例
/**
* 源发器类
* @author huangyzh
* @create 2020-05-20 1:01
*/
public class Emp {
private String ename;
private int age;
private double salary;
//进行备忘操作,并返回备忘录对象
public EmpMemento memento(){
return new EmpMemento(this);
}
//进行数据恢复,恢复为指定备忘录对象的值
public void recovery(EmpMemento empMemento){
this.ename = empMemento.getEname();
this.age = empMemento.getAge();
this.salary = empMemento.getSalary();
}
//省略 构造器 getter setter toString方法
}
/**
* 备忘录类
* 负责存储进行Emp对象的内部状态,并可防止Emp对象以外的其他对象访问备忘录
* @author huangyzh
* @create 2020-05-20 1:02
*/
public class EmpMemento {
private String ename;
private int age;
private double salary;
public EmpMemento(Emp emp){
this.ename = emp.getEname();
this.age = emp.getAge();
this.salary = emp.getSalary();
}
//省略getter setter方法
}
/**
* 负责人类:管理备忘录对象
* 负责保存好备忘录
* @author huangyzh
* @create 2020-05-20 1:07
*/
public class CareTake {
private EmpMemento empMemento;
//可以通过增加容器,设置多个“备忘点”
// private List<EmpMemento> empMementoList = new ArrayList<>();
//备忘点较多时
//1.可以将备忘录压栈
// private Stack<EmpMemento> empMementoStack = new Stack<>();
//2.如果占用内存中太大,可以使用序列化,反序列化
public CareTake(EmpMemento empMemento) {
this.empMemento = empMemento;
}
public EmpMemento getEmpMemento() {
return empMemento;
}
}
public class Test01 {
public static void main(String[] args) {
Emp emp = new Emp("小王",19,3400);
System.out.println("初始化对象:"+emp);
CareTake take = new CareTake(emp.memento());//备份
emp.setAge(25);
emp.setSalary(7800);
emp.setEname("小李");
System.out.println("修改后的对象为:"+emp);
emp.recovery(take.getEmpMemento());
System.out.println("复原后的对象为:"+emp);
}
}