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


文章來源:https://blog.csdn.net/shift_wwx/article/details/80010046


定義:

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


使用場景:

  • 需要保存一個對象在某個適合的全部或部分狀態時。
  • 一個對象不希望外部直接訪問其內部狀態時。


UML類圖:


  • Originator:負責創建一個備忘錄,可以記錄,恢復自身內部的狀態。同時可以決定哪些狀態需要備忘。
  • Memoto:備忘錄角色,用於存儲Originator的內部狀態,並且可以防止Originator之外的對象訪問Memoto。
  • Caretaker:負責存儲備忘錄,不能對備忘錄的內容進行操作和訪問,只能講備忘錄傳遞給其他對象。


簡單實現:

public class Originator {
    private int mValue;

    public Originator() {}
	
    public void handler() {
	mValue = 100; //the value of mValue is Changed.
    }
	
    public void restore(Memoto memo) {
	mValue = memo.getState();//restore the value of mValue.
    }
	
    public Memoto createMemoto() {
	Memoto memo = new Memoto();
	memo.setState(mValue);//save the value of mValue before doing something.
	return memo;
    }
}

public class Memoto {
    private int mState;

    public Memoto() {}
	
    public void setState(int state) {
	mState = state;
    }
	
    public int getState() {
	return mState;
    }
}

public class Caretaker {
    private Memoto mMemo;

    public Caretaker() {}
	
    public Memoto restoreMemoto() {
	return mMemo;
    }
	
    public void storeMemoto(Memoto memo) {
        mMemo = memo;
    }
}

來看下client 代碼:

void main() {
    Originator ori1 = new Originator();
    ori.handler(); //do something

    Caretaker ct = new Caretaker();
    ct.storeMemoto(ori1.createMemoto());

    Originator ori2 = new Originator();
    ori2.restore(ct.restoreMemoto());
}

上面實例是個比較簡單的備忘錄模式,ori1 在處理一些事情只能可能會暫停,回來之后需要還原,通過Caretaker 將里面的信息保存下來。


Android中的備忘錄模式:

在Activity 中有這樣兩個函數:

    protected void onSaveInstanceState(Bundle outState) {
        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());

        outState.putInt(LAST_AUTOFILL_ID, mLastAutofillId);
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);
        }
        if (mAutoFillResetNeeded) {
            outState.putBoolean(AUTOFILL_RESET_NEEDED, true);
            getAutofillManager().onSaveInstanceState(outState);
        }
        getApplication().dispatchActivitySaveInstanceState(this, outState);
    }

    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (mWindow != null) {
            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
            if (windowState != null) {
                mWindow.restoreHierarchyState(windowState);
            }
        }
    }
在Activity 異常退出的時候可能需要保存之前的狀態信息,下次回來之后需要恢復。

onSaveInstanceState 並不是在每次Activity 退出的時候調用,只是在某種特殊的情況之下才會被調用,那么一般是那種場景下呢?

這種場景總結一句話:當某個Activity 變得容易被系統銷毀時,該Acitivity 的onSaveInstanceState 就會被執行,除非該Activity 是用戶主動銷毀的,如用戶按Back 鍵。

意思就是說,該Activity 還沒有被銷毀,而僅僅是一種可能性,這種可能性有這么幾種情況:

  • 當用戶按下Home 鍵
  • 長按Home 鍵,選擇其他的程序
  • 按下電源鍵(關閉屏幕)時
  • 從Activity A 中啟動一個新的Activity時
  • 屏幕方向切換,如從橫屏切豎屏
  • 電話打入時

 換句話onSaveInstanceState 的調用遵循一個原則,當系統存在“未經允許”時銷毀Activity時,onSaveInstanceState 會被調用到。


具體的實現過程可以看source code。


優點:

  • 提供了一種備份恢復機制,使用戶能方便的回到某個時刻的狀態。
  • 保存的狀態是保存在發起人之外的類的,實現了對保存的狀態的封裝。發起人就不需要對備份進行管理了。


缺點:

  • 每一次保存都會消耗一定的內存。當保存的狀態非常多的時候,會非常消耗資源。




更多的設計模式看:Android中設計模式





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com