最近在继续iPhone业务的同时还需要重新拾起Android。在有些生疏的情况下,决定从Android源码中感悟一些Android的风格和方式。在学习源码的过程中也发现了一些通用的模式,希望通过一个系列的文章总结和分享下。
    该模式在不破坏封装的情况下,捕捉一个对象的内部状态,这样就可以在之后恢复到该状态。对于Android来说,在横竖屏切换的时候就可能需要在切换前捕捉状态,这样在切换后就可以进行恢复。

以TimePicker为例,备忘录模式实现的类图如下:
Android和设计模式:备忘录模式_第1张图片
    其中,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 CREATOR
                = new Creator() {
            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());
    }
    ......   
}