设计模式之备忘录模式【Memento Pattern】

忘录模式是一种行为模式,主要用于保存和恢复对象在某个时刻的内部状态。

1、定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态。

2、使用场景

  • 需要保存一个对象的在某个时刻的状态或部分状态
  • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,这是可以通过中间对象间接访问其内部状态。

3、UML图

这里写图片描述

  • Memento:备忘录,主要用来存储原发器的内部状态信息。它只能由原发器对象来访问它内部的数据。
  • Originator:原发器,需要保存和恢复状态的对象。创建备忘录并用来保存某个时刻的自身状态信息。也可以使用备忘录来恢复自身的内部状态。
  • Caretaker:备忘录管理者,主要负责保存备忘录对象,但是不能对备忘录的内容进行操作和访问。

4、示例代码

//备忘录
public class Memento {

    private String state;

    public Memento() {
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

//需要保存状态信息的原发器
public class Originator {

    private String state;

    /**
     * 创建备忘录对象
     */
    public Memento createMemento() {
        Memento memento =  new Memento();
        memento.setState(state);
        return memento;
    }

    /**
     * 从备忘录对象中恢复数据
     */
    public void restore(Memento memento) {
        this.state = memento.getState();
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

//备忘录管理者,主要用来保存备忘录
public class Caretaker {

    private Memento memento;

    /**
     * 获取备忘录
     */
    public Memento restoreMemento() {
        return this.memento;
    }

    /**
     * 保存备忘录
     */
    public void storeMemento(Memento memento) {
        this.memento = memento;
    }
}

客户端调用:

public class Client {

    public static void main(String args[]) {

        Originator o = new Originator();
        Caretaker c = new Caretaker();
        // 改变原发器对象的状态
        o.setState("On");
        System.out.println("初始状态:" + o.getState());

        // 创建备忘录对象,并将原发器对象的状态储存起来
        c.storeMemento(o.createMemento());

        // 修改原发器的状态
        o.setState("Off");
        System.out.println("改变后的状态:" + o.getState());

        // 恢复原发器对象的状态
        o.restore(c.restoreMemento());

        System.out.println("恢复后的状态:" + o.getState());
    }
}

调用结果:
这里写图片描述

备忘录的本质是保存和恢复内部状态。

猜你喜欢

转载自blog.csdn.net/iluojie/article/details/80381681