狀態模式的使用場景

狀態模式的使用場景

    類似於策略模式,都是爲了解決多個if…else存在的複雜問題,他的結構圖和策略模式的一模一樣,但是解決的問題不一樣。

    在android中可以用來解決嵌套dialog的顯示,比如有一堆彈窗,A,B,C … 他們會按照順序進行顯示,可能我們常做的是先顯示一個,用戶點擊了確定,再判斷點擊事件顯示第二個,以此類推,這樣的話嵌套耦合度太高,之後如果增加了新的需求,或者維護代碼都容易帶來一堆問題

    對應於以下這種多個if else嵌套的判斷:

public void m1(){
    if(a){
        m2();// 用戶點擊確定繼續顯示dialog m2
    }
}

public void m2(){
    if(b){
        m3();// 用戶點擊確定繼續顯示dialog m3
    }
}

public void m3(){
    if(c){
        ...// 類似於m1,m2
    }
}

    對於上述這些一堆嵌套的dialog彈窗。我們可以進行簡化,還是每個部分單獨成類,他們的共同點是一個執行動作,一個跳轉動作。所以可以抽象出一個父類IParent.

abstract class IParent {
    public abstract void doActiont();
    
   void toNext(Fragment fragment){
       fragment.go(getObj());
   }
   
   public abstract getObj();
}

    對於嵌套的彈窗都有一個共同的執行者,那就是在哪裏或者是誰需要展示它們。也就是我們需要找出狀態的設定者,可以將它們共同展示的頁面fragment或者activity作爲狀態設置者。

public void go(IParent p){
    p.doAction();
}

    這樣需要把執行者傳入每個實現類中,由執行者去進行對應的動作。當然開始動作也是有執行者執行。

// 開始顯示dialog
fragmetn.go(new a());// 傳入第一個要顯示的對象即可

改造後的代碼

class a extend IParent{
    public void doActiont(){
        if(a){
            ... 
            toNext(Fragment fragment);
            ...
        }
    }
    
    public IParent getObj(){
        return new b();// 返回下一個要顯示的dialog
    }
}

class b extends IParent{
    // 類似於a
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章