备忘录模式

1.定义

备忘录(Memento)模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.

2.实现

备忘录(Memento)模式

  • 原发器(Originator)角色
  • 负责人(Caretaker)角色
  • 备忘录(Memento)角色

原发器(Originator)角色:业务类

/**
 * 业务类
 */
public class Originator {

    private String state;

    public Originator() {
    }

    // 创建一个备忘录对象
    public Memento createMemento() {
        return new Memento(this);
    }

    // 根据备忘录对象恢复原发器状态
    public void restoreMemento(Memento m) {
        state = m.getState();
    }

    // ... setter/getter
}

备忘录(Memento)角色:存储原发器的内部状态,根据原发器来决定保存哪些内部状态

/**
 * Memento角色
 */
public class Memento {

    private String state;

    public Memento(Originator o) {
        state = o.getState();
    }

    // ... setter/getter
}

负责人(Caretaker)角色:负责保存备忘录,但是不能对备忘录的内容进行操作或检查

/**
 * 负责人(Caretaker)角色
 */
public class Caretaker {

    private Map<String, Memento> map = new HashMap<String, Memento>();

    public Memento recoveryMemento(String state) {
        return map.get(state);
    }
    public void saveMemento(String state, Memento memento) {
        this.map.put(state, memento);
    }
}

测试客户端

/**
 * 测试客户端
 */
public class MementoClient {

    public static void main(String[] args) {
        // 新建业务模型
        Originator originator = new Originator();
        originator.setState("StateA");

        // 新建备忘录
        Memento memento = originator.createMemento();

        // 保持备忘录记录
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemento(memento.getState(), memento);

        Originator newOriginator = new Originator();
        newOriginator.setState("StateB");
        memento = newOriginator.createMemento();
        caretaker.saveMemento(memento.getState(), memento);

        // 撤销
        System.out.println("撤销状态StateB");
        Memento recoveryMemento = caretaker.recoveryMemento("StateB");
        originator.restoreMemento(recoveryMemento);
        System.out.println(originator.getState());
    }
}

results matching ""

    No results matching ""