前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、Memento 备忘录模式

备忘录模式通常用来存储某个时刻的状态/数据,而这种状态/数据一般情况下不会到数据库中,而只是在代码层面保存,经过一些流程,找出前面的流程中的状态。

备忘录模式大家肯定都见过,比如在玩游戏的时候有一个保存当前闯关的状态的功能,会对当前用户所处的状态进行保存,当用户闯关失败或者需要从快照的地方开始的时候,就能读取当时保存的状态完整地恢复到当时的环境,这一点和VMware上面的快照功能很类似

1.1、备忘录模式和复制模式的区别

1、原型模式:解决的是创建对象的代价比较大的时候,保存的是当前对象的所有状态信息,恢复的时候会生成与保存的对象完全相同的另外一个实例;

2、备忘录模式用于保存和恢复对象的状,备忘录模式保存的是我们关心的在恢复时需要的对象的部分状态信息,相当于快照。。

1.2、示例代码

1.2.1、Memento:备忘录内容


@Data
public class Memento {

    private String state;
    private float x;
    private float y;

    public Memento(String state, float x, float y) {
        this.state = state;
        this.x = x;
        this.y = y;
    }

}

1.2.2、备忘录管理器


public class MementoManager {

    private List<Memento> mementos;



    public MementoManager(){
        mementos = new ArrayList<>();
    }

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


    public List<Memento> getMementoList() {
        return mementos;
    }

    /**
     * 通过状态恢复
     */
    public Memento getByState(String status) {
        for (Memento memento :mementos){
            if(status.equals(memento.getState())){
                return memento;
            }
        }
        return null ;
    }
}

2.3、要保存的数据

@Data
public class Originator {

    private String state;
    private float x;
    private float y;

    /**
     * 保存到备忘录
     * @return
     */
    public Memento saveToMemento() {
        return new Memento(state, x, y);
    }

    /**
     * 从备忘录恢复
     * @param memento
     */
    public void restoreFromMemento(Memento memento) {
        this.state = memento.getState();
        this.x = memento.getX();
        this.y = memento.getY();
    }

}

2.4、测试

public class D18Main {

    public static void main(String[] args) {

        //需要保存的数据
        Originator originator = new Originator();

        //备忘录管理,负责存储历史状态
        MementoManager manager = new MementoManager();
        originator.setState("2017-01-01");
        originator.setX(1.4f);
        originator.setY(5.4f);
        manager.add(originator.saveToMemento());

        originator.setState("2017-04-03");
        originator.setX(44.4f);
        originator.setY(52.4f);
        manager.add(originator.saveToMemento());

        originator.setState("2017-06-01");
        originator.setX(231.4f);
        originator.setY(555.4f);
        //记录状态
        manager.add(originator.saveToMemento());

        originator.setState("2017-06-22");
        originator.setX(132.4f);
        originator.setY(53.4f);
        //记录状态
        manager.add(originator.saveToMemento());

        System.out.println("当前状态:");
        System.out.println(originator.getState() + ": " + originator.getX() + ", " + originator.getY());


        System.out.println("状态历史:");
        for (Memento m : manager.getMementoList()) {
            System.out.println(m.getState() + ": " + m.getX() + ", " + m.getY());
        }


        //恢复到指定状态--2017-04-03
        originator.restoreFromMemento(manager.getByState("2017-04-03"));
        System.out.println("恢复后的状态:");
        System.out.println(originator.getState() + ": " + originator.getX() + ", " + originator.getY());
    }
}