狀態模式的使用場景
類似於策略模式,都是爲了解決多個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
}