狀態模式——《Android源碼設計模式解析與實踐》讀書筆記8

定義

當一個對象的內在狀態改變時,其行為也隨之改變,從外部觀察這個對象像是改變了類。


使用場景

(1)一個對象的行為取決于它的狀態,并且它必須在運行時根據狀態改變其行為。

(2)代碼中包含大量與對象狀態有關的條件語句。


UML類圖

狀態模式,多角色

關鍵點

(1)狀態模式和策略模式的結構幾乎完全一樣,但他們的目的、本質完全不一樣。狀態模式的行為是平行的、不可替換的;策略模式的行為是彼此獨立、可相互替換的。

(2)狀態模式將每一個條件分支放入一個獨立的類中,使得使用者可以根據對象自身的情況將對象的狀態作為一個可獨立變化的對象。

(3)在不同的狀態中對同一個請求做了不同的處理。

(4)狀態模式的實質是將一個if-else或者switch-case用多態來實現。


實現方式

狀態接口

public interface State{

? ? int operation1();

? ? int operation2();

}

狀態A類

public class StateA implements State{

? ? @Override

? ? public int operation1(){

? ? ? ? return 1;

? ? }

? ? @Override

? ? public int operation2(){

? ? ? ? return 0;

? ? }

}

狀態B類

public class StateB implements State{

? ? @Override

? ? public int operation1(){

? ? ? ? return 0;

? ? }

? ? @Override

? ? public int operation2(){

? ? ? ? return 1;

? ? }

}

Context類

public class Context{

? ? State mState;

? ? public void setState(State s){

? ? ? ? this.mState= s;

? ? }

? ? public int operation1(){

? ? ? ? return mState.operation1();

? ? }

? ? public int operation2(){

? ? ? ? return mState.operation2();

? ? }

}

調用例子:

public void class Test{

? ? public static void main(String [] args){

? ? ? ? StateA a = new StateA();

? ? ? ? Context context = new Context();

? ? ? ? context.setState(a);

? ? ? ? context.operation1();

? ? }

}


策略模式的優缺點

優點

將所有與一個特定狀態相關的行為都放入一個狀態對象中,將繁瑣的狀態判斷轉換成結構清晰的狀態類族,避免代碼膨脹,同時保證可擴展性和可維護性。

缺點

增加系統類和對象的個數


Android中的狀態模式舉例

Wifi的狀態類State的子類,如初始狀態子類InitialState,驅動加載狀態子類DriverStartingState等


——2017.08.09

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,949評論 18 139
  • 面向對象的六大原則 單一職責原則 所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這個類就具有多于...
    JxMY閱讀 973評論 1 3
  • 前言 系列文章 Android Architecture Component之Lifecycle-Aware Co...
    Jason騎蝸牛看世界閱讀 3,542評論 3 20
  • 23種設計模式 “對象性能”模式 面向對象很好的解決了“抽象”的問題,但是必不可免地要付出一定的代價。對于通常情況...
    孫浩_9bfd閱讀 394評論 0 0
  • 今天12點多的時候困了就直接睡了,到了14點就醒了,這種感覺好好啊\^O^/晚上也要早睡才行。 文學好像真的能深刻...
    呀莫閱讀 344評論 0 0