状态模式的使用场景
类似于策略模式,都是为了解决多个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
}