设计模式之管理状态_Memento备忘录模式_保存对象状态

前言

博主github

博主个人博客http://blog.healerjean.com

1、解释

在使用面向对象编程的时候,我们需要先保存实力的相关状态信息,然后再撤销时候,可以根据所保留的信息恢复到原来的状态

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

我们在使用文本编辑器编写文件时,如果不小心删除了某句话,可以通过CTRL+Z 将文件恢复到之前定的状态,有些文本编辑器可以多次撤销

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

**备忘录模式用于保存和恢复对象的状态,那么两者有何不同的呢? **

**1、原型模式保存的是当前对象的所有状态信息,恢复的时候会生成与保存的对象完全相同的另外一个实例; **

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

2、实例代码

2.1、Memento,备忘录内容

/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName Memento
 * @Date 2019/8/20  18:26.
 * @Description 备忘录角色,存储发起人的装
 */
@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;
    }

}

2.2、备忘录管理器,因为可能有多次撤销操作

/**
 * @author HealerJean
 * @ClassName MementoManager
 * @date 2019/8/20  18:29.
 * @Description 备忘录管理者
 */
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());
    }
}

3、总结

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



感兴趣的,欢迎添加博主微信

哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。

请下方留言吧。可与博主自由讨论哦

微信 微信公众号 支付宝
微信 微信公众号 支付宝
posted @ 2019-08-26 15:28  HealerJean  阅读(172)  评论(0编辑  收藏  举报