设计模式之备忘录模式

备忘录模式

行为型模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。

介绍

意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

主要解决: 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用: 很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

如何解决: 通过一个备忘录类专门存储对象状态。

关键代码: 客户不与备忘录类耦合,与备忘录管理类耦合。

具体实现

设计模式之备忘录模式_第1张图片

第一步:创建备忘录对象

public class Memento {

    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

第二步:创建需要被保存状态的对象

public class Originator {

    private String state;

    public String getState() {
        return state;
    }

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


    //保存对象状态
    public Memento saveStateMemento() {
        return new Memento(state);
    }


    //通过备忘录对象,恢复状态
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}

第三步:创建集合类来管理多个备忘录对象

public class Caretaker {

    private List mementos = new ArrayList<>();

    public void add(Memento memento) {
        mementos.add(memento);
    }

    public Memento get(int index) {
        return mementos.get(index);
    }

}

第四步:创建测试类

public class Client {

    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        originator.setState("状态①,攻击力为100");
        //保存当前状态
        caretaker.add(originator.saveStateMemento());
        originator.setState("状态②,攻击力为800");
        //保存当前状态
        caretaker.add(originator.saveStateMemento());
        originator.setState("状态③,攻击力为500");
        //保存当前状态
        caretaker.add(originator.saveStateMemento());
        System.out.println("当前状态为:" + originator.getState());
        //恢复到状态①
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("恢复后当前状态为:" + originator.getState());
    }

}

运行如下:

当前状态为:状态③,攻击力为500
恢复后当前状态为:状态①,攻击力为100

优点:

    1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

    2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:

    消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

你可能感兴趣的:(java,设计模式)