备忘录模式
标签:设计模式

备忘录模式(Memento)

备忘录模式是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。

1. 备忘录模式中的角色及其职责

1.1 原生者(Originator)

需要被保存状态以便恢复的那个对象

Person

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /**
     * 创建一个备份
     * @return
     */
    public Memento createMemento(){
        return new Memento(name,age);
    }

    /**
     * 恢复备份,还原
     * @param memento
     */
    public void restoreFromMemento(Memento memento){
        this.name=memento.getName();
        this.age=memento.getAge();
    }
}

1.2 备忘录(Memento)

该对象由Originator创建,主要用来保存Originator的内部状态

Memento

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class Memento {
    private String name;
    private int age;

    public Memento(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }
}

1.3 管理者(Caretaker)

负责在适当的时间保存/恢复 Originator对象的状态

Caretaker

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class Caretaker {
   private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}

Main

package com.liuyao;

public class Main {

    public static void main(String[] args) {
        Person person=new Person("aaa",24);
        Caretaker caretaker=new Caretaker();
        caretaker.setMemento(person.createMemento());

        System.out.println(person);

        person.setName("bbb");
        person.setAge(12);
        System.out.println(person);

        person.restoreFromMemento(caretaker.getMemento());
        System.out.println(person);
    }
}

//Person{name='aaa', age=24}
//Person{name='bbb', age=12}
//Person{name='aaa', age=24}

2. 应用场景

如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。

  • 2 min read

CONTRIBUTORS


  • 2 min read