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

  備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象外保存這個狀態,這樣之後可將此對象恢復成原來的狀態。測試

  就拿單機遊戲舉例,玩遊戲打boss前咱們一般都會存檔,避免打boss時失誤死亡好恢復存檔從新開始,咱們首先看下面的例子。this

//遊戲鬼泣的主角Dante類
public class Dante {
    //生命值
    private int health;
    //魔法值
    private int mana;

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getMana() {
        return mana;
    }

    public void setMana(int mana) {
        this.mana = mana;
    }

    //角色的初始狀態
    public void getInitState(){
        this.health = 100;
        this.mana = 100;
    }

    public void deathState(){
        this.health = 0;
        this.mana = 0;
    }

    public void showState(){
        System.out.println("health:"+health+",mana:"+mana);
    }
}

 

public class Test  {
    public static void main(String[] args) {
        //初始化狀態
        Dante dante = new Dante();
        dante.getInitState();
        dante.showState();

        //存檔
        Dante danteBak = new Dante();
        danteBak.setHealth(dante.getHealth());
        danteBak.setMana(dante.getMana());

        //角色死亡時的狀態
        dante.deathState();
        dante.showState();

        //恢復存檔
        dante.setHealth(danteBak.getHealth());
        dante.setMana(danteBak.getMana());
        dante.showState();
    }
}

測試結果:spa

health:100,mana:100
health:0,mana:0
health:100,mana:100code

  上面的方法雖然實現了存檔,但是實現的並不優美,在測試方法中暴露了太多存檔的實現細節,而且若是之後須要保存新的角色屬性,那咱們就須要修改客戶端,因此咱們就用到了備忘錄模式,把角色屬性的保存封裝在單獨的類中,體現「職責分離」。示例以下。對象

  首先定義了一個「存儲卡」類,用於保存角色數據blog

public class MemoryCard {

    private int health;

    private int mana;

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getMana() {
        return mana;
    }

    public void setMana(int mana) {
        this.mana = mana;
    }

    public MemoryCard(int health,int mana){
        this.health =health;
        this.mana = mana;
    }
}

 

  角色狀態管理者,用於保存存儲卡,而且不能對存儲卡的內容進行操做遊戲

public class MemoryCardCreataker {

    private MemoryCard memoryCard;

    public MemoryCard getMemoryCard() {
        return memoryCard;
    }

    public void setMemoryCard(MemoryCard memoryCard) {
        this.memoryCard = memoryCard;
    }
}

 

  遊戲角色類內存

//遊戲鬼泣的主角Dante類
public class Dante {
    //生命值
    private int health;
    //魔法值
    private int mana;

    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }

    public int getMana() {
        return mana;
    }

    public void setMana(int mana) {
        this.mana = mana;
    }

    //角色的初始狀態
    public void getInitState(){
        this.health = 100;
        this.mana = 100;
    }

    public void deathState(){
        this.health = 0;
        this.mana = 0;
    }

    public void showState(){
        System.out.println("health:"+health+",mana:"+mana);
    }

    //將角色狀態保存在存儲卡中
    public MemoryCard saveState(){
        return new MemoryCard(health,mana);
    }

    //回檔
    public void recoveryState(MemoryCard memoryCard){
        this.health = memoryCard.getHealth();
        this.mana = memoryCard.getMana();
    }
}

  測試方法資源

public class Test  {
    public static void main(String[] args) {
        //初始化狀態
        Dante dante = new Dante();
        dante.getInitState();
        dante.showState();

        //存檔
        MemoryCardCreataker memoryCardCreataker = new MemoryCardCreataker();
        memoryCardCreataker.setMemoryCard(dante.saveState());

        //角色死亡時的狀態
        dante.deathState();
        dante.showState();

        //恢復存檔
        dante.recoveryState(memoryCardCreataker.getMemoryCard());
        dante.showState();
    }
}

測試結果:get

health:100,mana:100
health:0,mana:0
health:100,mana:100

總結    優勢:使用備忘錄模式很好地將被保存的對象和保存的狀態分隔開來,而且該對象狀態備份和恢復不須要本身處理,而是轉交給客戶端處理,而且如何保存的細節封裝到了存儲卡中,再也不影響客戶端。

   缺點:因爲備忘錄對象會消耗內存,若是須要保存的狀態佔用的內存較大時,資源的消耗也就越大。

相關文章
相關標籤/搜索