標籤:android狀態模式
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述狀態(State)模式的:
狀態模式,又稱狀態物件模式(Pattern of Objects for States),狀態模式是對象的行為模式。
狀態模式允許一個對象在其內部狀態改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣。
狀態模式的結構
用一句話來表述,
狀態模式把所研究的對象的行為封裝在不同的狀態物件裡,每一個狀態物件都屬於一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式的示意性類圖如下所示:
狀態模式所涉及到的角色有:
● 環境(Context)角色,也成上下文:此例中由DataConnecton充當,定義用戶端所感興趣的介面,並且保留一個具體狀態類的執行個體。這個具體狀態類的執行個體給出此環境對象的現有狀態。
● 抽象狀態(State)角色:定義一個介面IState,用以封裝環境(Context)對象的一個特定的狀態所對應的行為。
● 具體狀態(ConcreteState)角色:此例中由DcXXXState充當,每一個具體狀態類都實現了環境(Context)的一個狀態所對應的行為。
● 用戶端角色:此例中由DcController充當,管理和維護Context。(文字來源於網路)
此執行個體是Android4.4資料連線部分,DataConnecton繼承自StateMachine狀態機器類,StateMachine狀態機器類實現了State設計模式的應用,在WiFi、藍芽、資料連線這三種網路連接的管理實現都使用了State設計模式。
圖中看出,共定義了7種狀態子類,都是DataConnecton的內部類,資料連線在六種狀態中轉換,DefaultState是作為其他六個子類的父狀態類的,所謂父狀態類,就是當子狀態類無法處理(在processMessage方法中處理)時,就會交給父狀態類來處理。狀態的轉換是通過DataConnecton的transitionTo()方法來設定的。
原始碼(代碼太多,只貼Context管理State的代碼):
private DataConnection(PhoneBase phone, String name, int id, DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, DcController dcc) { //[mr2] removed //setDbg(false); addState(mDefaultState); addState(mInactiveState, mDefaultState);//mDefaultState作為父狀態 addState(mActivatingState, mDefaultState); addState(mRetryingState, mDefaultState); addState(mActiveState, mDefaultState); addState(mDisconnectingState, mDefaultState); addState(mDisconnectingErrorCreatingConnection, mDefaultState); setInitialState(mInactiveState);//設定初始狀態 }
未完待續,有不對的地方,請指正。
Android與設計模式——狀態(State)模式