1.核心
就是保存某个对象某个时刻内部状态的拷贝,这样就可以将该对象(通过拷贝的对象)恢复到原先的状态
2.结构
2.1 源发器类Originator–需要被拷贝的对象
2.2 备忘录类Memento–拷贝信息存放到此对象中
2.3 负责人类CareTaker–管理备忘录对象
3.实现方法
3.1 备忘录中的信息与源发器中的信息保持一致,备忘录中提供构造方法以源发器对象作为参数
3.2 源发器中提供两个方法
- memento()–备份一次,方法以当前对象为参数返回一个Memento对象
- recovery(Memento memento)–恢复数据,通过传入的Memento对象对属性进行重新赋值
3.3 负责人类
- 可以管理一个或多个备忘录结点
//管理一个结点
private Memento memento;
//使用容器管理多个备忘录结点
//private List mementos= new ArrayList<>();
//使用栈管理多个备忘录结点
//private Stack mementos =new Stack<>();
4.代码
4.1 创建源发器类
public class Emp {
private int id;
private String name;
private double salary;
//get&set方法、构造器、toString()
......
}
4.2 创建备忘录类
public class EmpMemento {
private int id;
private String name;
private double salary;
//创建对象时保存此时源发器内部状态
public EmpMemento(Emp emp){
this.id=emp.getId();
this.name=emp.getName();
this.salary=emp.getSalary();
}
//get&set方法、构造器、toString()
......
}
4.3 源发器中增加备份方法和恢复数据方法
//备忘一次
public EmpMemento memento(){
return new EmpMemento(this);
}
//进行数据恢复,恢复成指定备忘录对象的值
public void recovery(EmpMemento empMemento){
this.id=empMemento.getId();
this.name=empMemento.getName();
this.salary=empMemento.getSalary();
}
4.4 负责人类,管理备忘录对象
public class CareTaker {
//管理一个结点
private EmpMemento empMemento;
//使用容器管理多个备忘录结点
//private List<EmpMemento> empMementos= new ArrayList<>();
//使用栈管理多个备忘录结点
//private Stack<EmpMemento> empMementos =new Stack<>();
public EmpMemento getEmpMemento() {
return empMemento;
}
public void setEmpMemento(EmpMemento empMemento) {
this.empMemento = empMemento;
}
}
4.5 测试
public class Client {
public static void main(String[] args) {
//创建负责人类
CareTaker taker=new CareTaker();
//创建源发器对象
Emp emp = new Emp(1,"古力娜扎",400);
System.out.println("第一次打印:"+emp);
//备忘一次
taker.setEmpMemento(emp.memento());
//修改
emp.setId(2);
emp.setName("马尔扎哈");
emp.setSalary(4000);
System.out.println("修改后打印:"+emp);
//恢复数据
emp.recovery(taker.getEmpMemento());
System.out.println("恢复后打印:"+emp);
}
}
4.6 结果