状态模式
本来我还在纠结要说什么模式好,但前几天听到了一件有趣的事,有个研究生曾经把几千行的代码写在一个类里面(里面有无数个if else if else….if else,而且那些方法都在里面实现),然后编译之后根本没错,但是却把系统拖垮了?什么原因了,一位大神帮他找了很久很久都找不出错误。却在最后发觉那个类编译后的class文件大于64KB…….这警示我们写代码要有点技巧,好吧!那我就说一下状态模式,让大家摆脱一下if else痛苦的挣扎吧!
顺便看看我真实例子,我记得我曾经做过一个android的考试系统,会有2个状态:用户没WIFI或者Internet不能上网和用户能够上网:
(1)假如能够上网
网上拿考试题目
(2)假如不能上网
数据库拿考试题目
由于以前写代码太年轻了
If(State ==1){
XXOO…
}
Else if(State==2){
XXOO….
}
…….
(可能我毕业了,你们来维护我的代码,谁能明白1,2,3,4这些魔鬼数字呢?)
好吧,后来我从2B青年进化为普通青年了,请看下面:
public static final int INTER_EXAM=1;
public static final int DB_EXAM=2;
if(State == INTER_EXAM){
XXOO…
}
……
这样会不会好一点点呢?呵呵,后面看了设计模式,就变为文艺青年了:
Public abstract class State{
dojob();
}
Public class InternetState implements State{
dojob(){
XXOO…
}
}
Public class DBState implements State{
dojob(){
XXOO…
}
}
Public class Handle {
State Internet_State;
State DB_State;
State state =null;
Public voidinit(){
Internet_State = newInternetState();
DB_State= new DBState();
}
Public void dojob(){
If(能上网){
state = Internet_State;
state.dojob();
}
Else{
state = DB_State;
state.dojob();
}
}
}
好处:
(1) 为了方便举例,所以状态少了点,优势不太多,但当你有上十种状态的时候,而且手机的状态是在无时无刻变化的,这样就很容易管理了
(2) 当你要修改代码时,只需要找到具体State那个类,修改dojob就OK了。
(3) 当需要添加状态的时候,只需要再写一个具体的State来实现抽象State的接口就OK了
你想宁愿在你那堆无限冗余复杂的if else 里面痛苦挣扎,还是比较喜欢这种优雅的管理方式呢?