备忘录模式
就是保存某个对象内部状态的拷贝,这样以后就可以将对象恢复到原先的状态
结构
- 源发器类originator:就是我们的业务模型,它本身可能有非常多的字段(或叫做变量)。一个字段的值发生了改变,我们可以认为Originator的状态就发生了变化。Originator里面有一个IMemento类型的字段用来记录状态的变化(它相当于一个记事本,用来备忘的)
- 备忘录类Memento:IMemento聚合与Caretaker
- 负责人类CareTake :用来决定什么时候将IMemento(备忘录)对象中的状态还原到Originator(原发器)中
- IMemento(备忘录类型)
- IState(状态类型)
或者直接描述为
- 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
- 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
- 管理角色:对备忘录进行管理,保存和提供备忘录。
代码
/** * 源发器类 */ public class EmployeeOriginal { private String name; private int age; private double salary; public EmployeeOriginal(String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } //进行备忘操作,并返回备忘对象 public EmployeeMemento memento(){ return new EmployeeMemento(this); } //进行数据恢复,恢复到指定的备忘录状态 public void recovery(EmployeeMemento memento){ this.name = memento.getName(); this.age = memento.getAge(); this.salary = memento.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 EmployeeMemento { private String name; private int age; private double salary; public EmployeeMemento(EmployeeOriginal original){ this.name = original.getName(); this.age = original.getAge(); this.salary = original.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; } } /** * Created by jenny on 5/16/16. * 负责人类:管理备忘录对象 */ public class CareTake { 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){ CareTake careTake = new CareTake(); //原始数据 EmployeeOriginal employeeOriginal = new EmployeeOriginal("wo",12,900); careTake.setMemento(employeeOriginal.memento()); System.out.println(employeeOriginal.getName()); System.out.println(employeeOriginal.getAge()); System.out.println(employeeOriginal.getSalary()); //重新赋值 employeeOriginal.setAge(20); employeeOriginal.setName("ni"); employeeOriginal.setSalary(190); //恢复了 employeeOriginal.recovery(careTake.getMemento()); System.out.println(employeeOriginal.getName()); System.out.println(employeeOriginal.getAge()); System.out.println(employeeOriginal.getSalary()); } }备忘录模式的优点有:
- 当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。
- 备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。
备忘录模式的缺点:
- 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。
如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。