设计模式之备忘录模式memento

备忘录模式
就是保存某个对象内部状态的拷贝,这样以后就可以将对象恢复到原先的状态
结构
  • 源发器类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恢复等。

 

猜你喜欢

转载自jenny-run.iteye.com/blog/2298740