Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 《Android源碼設計模式解析與實戰》讀書筆記(十三)

《Android源碼設計模式解析與實戰》讀書筆記(十三)

編輯:關於android開發

《Android源碼設計模式解析與實戰》讀書筆記(十三)


第十三章、備忘錄模式

備忘錄模式是一種行為模式,該模式用於保存對象當前的狀態,並且在之後可以再次恢復到此狀態,有點像是我們平常說的”後悔藥”。

1.定義

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

2.使用場景

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

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

3.簡單實現

書中例子:以”使命召喚”游戲為例,用游戲中的存檔功能來舉例。

首先是備忘錄類

/**
 * 備忘錄類
 */
public class Memento {
    public int mCheckpoint;//武器

    public int mLiftValue;//生命

    public String mWeapon;//關卡

    @Override
    public String toString() {
        return "Memento [mCheckpoint=" + mCheckpoint + ",mLiftValue="
                + mLiftValue + ",mWeapon=" + mWeapon + "]";
    }

}

游戲類,在該類可以通過createMemento函數來創建該用戶的備忘錄對象,外部可以通過restore函數將CallOfDuty 對象的狀態從備忘錄對象中恢復。

/**
 * 
 * 簡單模擬“使命召喚”游戲 
 * 
 */

public class CallOfDuty {

    private int mCheckpoint = 1;

    private int mLiftValue = 100;

    private String mWeapon = "沙漠之鷹";

    //玩游戲
    public void play(){
        System.out.println("打游戲:"+String.format("第%d關", mCheckpoint) + "奮戰殺敵中");
        mLiftValue -= 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 Memento createMemento(){
        Memento memento = new Memento();
        memento.mCheckpoint = mCheckpoint;
        memento.mLiftValue = mLiftValue;
        memento.mWeapon = mWeapon;
        return memento;
    }

    //恢復游戲
    public void restore(Memento memento){
        this.mCheckpoint = memento.mCheckpoint;
        this.mLiftValue = memento.mLiftValue;
        this.mWeapon = memento.mWeapon;
        System.out.println("恢復後的游戲屬性:" + this.toString());
    }

    //省略getter和setter方法

    @Override
    public String toString() {
        return "CallOfDuty [mCheckpoint=" + mCheckpoint + ",mLiftValue="
                + mLiftValue + ",mWeapon=" + mWeapon + "]";
    }
}

備忘錄操作類:

/**
 * Caretaker,負責管理Memento
 */
public class Caretaker {

    Memento mMemento; //備忘錄

    /**
     * 存檔
     */
    public void archive(Memento memento){
        this.mMemento = memento;
    }

    /**
     * 獲取存檔
     */
    public Memento getMemento(){
        return mMemento;
    }
}

客戶端使用代碼:

public class Client {
    public static void main(String[] args) {
        //構建游戲對象
        CallOfDuty game = new CallOfDuty();
        //1.打游戲
        game.play();

        Caretaker caretaker = new Caretaker();
        //2.游戲存檔
        caretaker.archive(game.createMemento());
        //3.退出游戲
        game.quit();
        //4.恢復游戲
        CallOfDuty newGame = new CallOfDuty();
        newGame.restore(caretaker.getMemento());

        //5.再次打游戲(不存檔)
        game.play();
        //6.恢復之前存檔
        newGame.restore(caretaker.getMemento());
    }
}

結果:

打游戲:第1關奮戰殺敵中
進度升級了
到達第2關
--------------
退出前的游戲屬性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
退出游戲
--------------
恢復後的游戲屬性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]
打游戲:第2關奮戰殺敵中
進度升級了
到達第3關
恢復後的游戲屬性:CallOfDuty [mCheckpoint=2,mLiftValue=90,mWeapon=沙漠之鷹]

上面的代碼中,各個角色職責清晰、單一,代碼也比較簡單,即對外屏蔽了對CallOfDuty角色的直接訪問,在滿足了對象狀態存取功能的同時也使得該模塊的結構保持清晰、整潔。

4.Android源碼中的備忘錄模式

1.onSaveInstanceState和onRestoreInstanceState

當Activity不是正常方式退出,且Activity在隨後的時間內被系統殺死之前會調用這兩個方法讓開發人員可以有機會存儲Activity相關信息,且在下次返回Activity時恢復這些數據。通過這兩個函數。開發人員能夠在某些特殊場景下儲存與界面相關的信息,提升用戶體驗。

5.總結

1.優點

(1)給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史狀態。

(2)實現了信息的封裝,使用戶不需要關心狀態的保存細節。

2.缺點

消耗資源,如果類的成員變量過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的內存。


PS:這篇應該是今年的最後一篇了,《Android源碼設計模式解析與實戰》一共26章,這個月剛好看到了一半了,下個月繼續努力。最後也祝大家元旦快樂,在新一年技術突飛猛進!!最後謝謝大家的支持,就這樣!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved