23种设计模式-备忘录模式(使命召唤)

2019-02-28  本文已影响0人  王灵

定义:在不破环封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态。
使用场景:
1、需要保存一个对象在某一时刻的状态或部分状态。
2、如果用一个接口来让其它对象获得这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。
游戏存档简单使用

/**
 * 数据bean
 */
public class Memoto {
    public int mCheckpoint;
    public int mLifeValue;
    public String mWeapon;

    @Override
    public String toString() {
        return "Memoto{" +
                "mCheckpoint=" + mCheckpoint +
                ", mLifeValue=" + mLifeValue +
                ", mWeapon='" + mWeapon + '\'' +
                '}';
    }
}


/**
 * 备忘录的操作者
 */
public class Caretaker {
    Memoto mMemoto;

    public Memoto getmMemoto() {
        return mMemoto;
    }

    public void archive(Memoto mMemoto) {
        this.mMemoto = mMemoto;
    }
}

/**
 * 使命召唤游戏(数据模型可能不太合理,这里我们这是简单演示)
 */
public class CallofDuty {
    private int mCheckpoint=1;
    private int mLifeValue=100;
    private String mWeapon="沙漠之鹰";
    /**
     * 玩游戏
     */
    public void play(){
        Log.e("玩游戏:"+String.format("第%d关",mCheckpoint)+"奋战杀敌中");
        mLifeValue-=10;
        Log.e("进度升级了");
        mCheckpoint++;
        Log.e("到达"+String.format("第%d关",mCheckpoint));
    }
    /**
     * 退出游戏
     */
    public void quit(){
        Log.e("------------");
        Log.e("退出前的游戏属性:"+this.toString());
        Log.e("退出游戏");
        Log.e("------------");
    }
    /**
     * 创建备忘录
     */
    public Memoto creatMemoto(){
        Memoto memoto=new Memoto();
        memoto.mCheckpoint=mCheckpoint;
        memoto.mLifeValue=mLifeValue;
        memoto.mWeapon=mWeapon;
        return memoto;
    }
    /**
     * 恢复游戏
     */
    public void restore(Memoto memoto){
        this.mCheckpoint=memoto.mCheckpoint;
        this.mLifeValue=memoto.mLifeValue;
        this.mWeapon=memoto.mWeapon;
        Log.e("恢复后的游戏属性:"+this.toString());
    }

    @Override
    public String toString() {
        return "CallofDuty{" +
                "mCheckpoint=" + mCheckpoint +
                ", mLifeValue=" + mLifeValue +
                ", mWeapon='" + mWeapon + '\'' +
                '}';
    }
}


public class Client {
    public static void main(String[] args){
        //构建游戏对象
        CallofDuty game=new CallofDuty();
        //1.打游戏
        game.play();

        Caretaker caretaker=new Caretaker();
        //2.游戏存档
        caretaker.archive(game.creatMemoto());
        //3.退出游戏
        game.quit();
        //4.恢复游戏
        CallofDuty newGame=new CallofDuty();
        newGame.restore(caretaker.getmMemoto());
    }
}

上一篇下一篇

猜你喜欢

热点阅读