備忘錄模式

1類圖

這裏寫圖片描述

2定義:

2.1 在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。

3應用場景:

3.1 需要保存一個對象在某一時刻的狀態或部分狀態。

3.2 如果用一個接口來讓其他對象得到這些狀態,將會暴露對象的實現細節並破壞對象的封裝性,一個對象不希望外界直接訪問其內部狀態,通過中間對象可以間接訪問其內部狀態。

4模擬類

public class CallofDuty {
    private int mCheckpoint = 1;
    private int mLifeValue = 100;
    private String mWeepon = "沙漠之鷹";

    public void play(){
        System.out.println("玩遊戲:" + String.format("第%d關", mCheckpoint) + "奮鬥殺敵中!");
        mLifeValue -= 10;
        System.out.println("進度升級了");
        mCheckpoint++;
        System.out.println("達到 " + String.format("第%d關",mCheckpoint));
    }
    public void quit(){
        System.out.println("-----------");
        System.out.println("退出當前的遊戲屬性 : " + this.toString());
        System.out.println("退出遊戲");
        System.out.println("-----------");
    }

    public Memoto createMemoto(){
        Memoto memoto = new Memoto();
        memoto.mCheckpoint = mCheckpoint;
        memoto.mLifeValue = mLifeValue;
        memoto.mWeapon = mWeepon;
        return memoto;
    }

    public void restore(Memoto memoto){
        this.mCheckpoint = memoto.mCheckpoint;
        this.mLifeValue = memoto.mLifeValue;
        this.mWeepon = memoto.mWeapon;
        System.out.println("恢復後的遊戲屬性 : " + this.toString());
    }
    @Override
    public String toString() {
        return "CallofDuty [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeepon=" + mWeepon + "]";
    }



}

5創建要保存的對象類

public class Memoto {
    public int mCheckpoint;
    public int mLifeValue;
    public String mWeapon;
    @Override
    public String toString() {
        return "Memoto [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeapon=" + mWeapon + "]";
    }
}

6保存和回覆類

public class Caretaker {
    Memoto memoto;
    public void archive(Memoto memoto){
        this.memoto = memoto;
    }

    public Memoto getMemoto() {
        return memoto;
    }
}

7測試

public class Client {
    public static void main(String[] args) {
        CallofDuty game = new CallofDuty();
        game.play();

        Caretaker caretaker = new Caretaker();
        caretaker.archive(game.createMemoto());
        game.quit();
        CallofDuty newGame = new CallofDuty();
        newGame.restore(caretaker.getMemoto());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章