1. 程式人生 > >設計模式 --- 備忘錄模式

設計模式 --- 備忘錄模式

1.定義

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

 

2.使用場景

1)需要儲存一個物件在某一個時刻的狀態或部分狀態

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

 

3.簡單實現

模擬一個遊戲存檔的功能。

//定義一個遊戲類
class Game{
    private int lifeValue = 100; //遊戲人物生命值
    private int mLevel = 1; //遊戲人物等級
    private String mWeapon = "新手劍"; //人物裝備

    //模擬玩遊戲
    public void  playGame(){
        System.out.println("碰見了一隻 野豬 ! 奮力搏鬥中...");
        System.out.println("你損失了 -10HP !");
        lifeValue -= 10;
        System.out.println(this.toString());
        System.out.println("你擊殺了 野豬 ! 升級!");
        mLevel += 1;
        System.out.println(this.toString());
        System.out.println("野豬 爆出了 屠龍寶刀! 裝備中...");
        mWeapon = "屠龍寶刀";
        System.out.println(this.toString());
    }

    //退出遊戲
    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.lifeValue = lifeValue;
        memoto.mLevel = mLevel;
        memoto.mWeapon = mWeapon;
        return memoto;
    }

    //恢復遊戲
    public void reStore(Memoto memoto){
        System.out.println("--------------------------------------");
        System.out.println("存檔讀取中...");
        this.lifeValue = memoto.lifeValue;
        this.mLevel = memoto.mLevel;
        this.mWeapon = memoto.mWeapon;
        System.out.println("當前屬性:" + this.toString());
        System.out.println("--------------------------------------");
    }

    @Override
    public String toString() {
        return "[ Level:"+ this.mLevel +" Life:"+ lifeValue+" Weapone:"+ mWeapon+" ]";
    }
}

//建立一個備忘錄
class Memoto{
    public int lifeValue;
    public int mLevel ;
    public String mWeapon ;

    @Override
    public String toString() {
        return "[ Level:"+ this.mLevel +" Life:"+ lifeValue+" Weapone:"+ mWeapon+" ]";
    }
}

//備忘錄操作者
class Caretaker{
    Memoto memoto;
    //存檔
    public void archive(Memoto memoto){
        this.memoto = memoto;
    }
    //讀檔
    public Memoto getMemoto(){
        return memoto;
    }
}

public class OriginatorMode {

    public static void main(String[] args){
        //構建遊戲物件
        Game game = new Game();
        //打遊戲
        game.playGame();
        //遊戲存檔
        Caretaker caretaker = new Caretaker();
        caretaker.archive(game.createMemoto());
        //退出遊戲
        game.quit();
        //重新恢復遊戲 重新新建一個物件
        Game gameTwo = new Game();
        gameTwo.reStore(caretaker.getMemoto());

    }
}

輸出:

 

4.小結

優點:

1.給使用者提供了一種可以恢復狀態的機制,比較方便地回到某個歷史狀態;

2.實現了資訊的封裝,使使用者不需要關心狀態的儲存細節。

缺點:

資源消耗,如果類的成員變數太多,會佔用較大資源,而且每一次儲存會消耗一定的記憶體資源。