Android和設計模式:備忘錄模式

 
    最近在繼續iPhone業務的同時還須要從新拾起Android。在有些生疏的狀況下,決定從Android源碼中感悟一些Android的風格和方式。在學習源碼的過程當中也發現了一些通用的模式,但願經過一個系列的文章總結和分享下。
    該模式在不破壞封裝的狀況下,捕捉一個對象的內部狀態,這樣就能夠在以後恢復到該狀態。對於Android來講,在橫豎屏切換的時候就可能須要在切換前捕捉狀態,這樣在切換後就能夠進行恢復。

以TimePicker爲例,備忘錄模式實現的類圖以下:
clip_p_w_picpath002[4]
    其中,SavedState支持小時和分鐘數的存儲,這樣就能夠確保在一些關鍵節點先後保持狀態一直。
主要代碼以下:
public class TimePicker extends FrameLayout {
    ......
    /**
     * Used to save / restore state of time picker
     */
    private static class SavedState extends BaseSavedState {
        private final int mHour;
        private final int mMinute;
        private SavedState(Parcelable superState, int hour, int minute) {
            super(superState);
            mHour = hour;
            mMinute = minute;
        }
        private SavedState(Parcel in) {
            super(in);
            mHour = in.readInt();
            mMinute = in.readInt();
        }
        public int getHour() {
            return mHour;
        }
        public int getMinute() {
            return mMinute;
        }
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            super.writeToParcel(dest, flags);
            dest.writeInt(mHour);
            dest.writeInt(mMinute);
        }
        public static final Parcelable.Creator<SavedState> CREATOR
                = new Creator<SavedState>() {
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }
            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
    }
    @Override
    protected Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        return new SavedState(superState, mCurrentHour, mCurrentMinute);
    }
    @Override     protected void onRestoreInstanceState(Parcelable state) {         SavedState ss = (SavedState) state;         super.onRestoreInstanceState(ss.getSuperState());         setCurrentHour(ss.getHour());         setCurrentMinute(ss.getMinute());     }     ......    }
相關文章
相關標籤/搜索