备忘录模式
就是保存某个对象内部状态的拷贝,这样以后就可以将对象恢复到原先的状态
结构
- 源发器类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恢复等。
本文介绍了备忘录设计模式的概念及实现方式,该模式通过保存对象的内部状态以便于后续恢复,适用于需要撤销操作或回滚到之前状态的场景。
1842

被折叠的 条评论
为什么被折叠?



