备忘录模式

一、定义

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

二、用处和缺点

用处:适用于功能比较复杂,但需要维护或记录属性历史的类。可以根据保存的memento信息还原到前一个状态。

缺点:角色状态需要存储到另一个备忘录对象中,在资源消耗上,内存消耗较大。

三、示例代码

/*发起人类 orginator*/
public class GameCharacter {

    private double bloodVolume;
    private double blueQuantity;
    private double experience;

    public double getBloodVolume() {
        return bloodVolume;
    }

    public void setBloodVolume(double bloodVolume) {
        this.bloodVolume = bloodVolume;
    }

    public double getBlueQuantity() {
        return blueQuantity;
    }

    public void setBlueQuantity(double blueQuantity) {
        this.blueQuantity = blueQuantity;
    }

    public double getExperience() {
        return experience;
    }

    public void setExperience(double experience) {
        this.experience = experience;
    }

    public void hitBoos() {
        this.bloodVolume = 0;
        this.blueQuantity = 0;
        this.experience = 0;
    }

    public void displayState() {
        System.out.println("bloodVolume:" + String.valueOf(bloodVolume));
        System.out.println("blueQuantity:" + String.valueOf(blueQuantity));
        System.out.println("experience:" + String.valueOf(experience));
        System.out.println("----------------------");
    }

    public void initCharacter(double bloodVolume, double blueQuantity, double experience) {
        this.bloodVolume = bloodVolume;
        this.blueQuantity = blueQuantity;
        this.experience = experience;
    }

    /*恢复备份*/
    public void recovery(StateStore stateStore) {
        this.bloodVolume = stateStore.getBloodVolume();
        this.blueQuantity = stateStore.getBlueQuantity();
        this.experience = stateStore.getExperience();

    }

    /*创建备份*/
    public StateStore backups() {

        StateStore stateStore = new StateStore(this.bloodVolume, this.blueQuantity, this.experience);
        return stateStore;
    }

}

/*备忘录类*/
public class StateStore {

    private double bloodVolume;
    private double blueQuantity;
    private double experience;

    public StateStore(double bloodVolume, double blueQuantity, double experience) {
        this.bloodVolume = bloodVolume;
        this.blueQuantity = blueQuantity;
        this.experience = experience;
    }

    public double getBloodVolume() {
        return bloodVolume;
    }


    public double getBlueQuantity() {
        return blueQuantity;
    }

    public double getExperience() {
        return experience;
    }

}

/*备忘录管理类*/
public class StorageManager {

    StateStore stateStore;

    public StateStore getStateStore() {
        return stateStore;
    }

    public void setStateStore(StateStore stateStore) {
        this.stateStore = stateStore;
    }
}

/*客户端*/
public class Client {

    public static void main(String[] args) {

        GameCharacter yasuo=new GameCharacter();
        yasuo.initCharacter(100,100,100);
        yasuo.displayState();

        /*设置好备份*/
        StateStore stateStore=yasuo.backups();

        StorageManager storageManager=new StorageManager();
        storageManager.setStateStore(stateStore);

        yasuo.hitBoos();

        /*回滚到备份数据*/
        yasuo.recovery(storageManager.getStateStore());

        yasuo.displayState();


    }
}

posted @ 2020-01-20 00:09  兮云飞扬  阅读(79)  评论(0编辑  收藏  举报