我们平常设计和编码的时候,经常会想到设计模式,但是怎么把设计模式用好,是个难点,下面作者用一系列文章来讲解下设计模式的用法。本节讲解:State模式
使用场景:
我们程序实现的时候,需要不停的进行状态切换,而且这个切换状态比较多,切换的方式没有规律性,那么需要用到State模式。
State和if-elseif 的区别:
一般的状态判断,使用if-elseif 就可以解决,比方下面的例子:
if(c==1) {
return "blue";
}else if(c==2) {
return "red";
}else if(c==3) {
return "green";
}
另外的一个例子就是:
if(color.equals("red")) {
return "blue";
}else if(color.equals("blue")) {
return "green";
}else if(color.equals("green")) {
return "red";
}
这种类型,使用if-else if 就可以解决,首先,颜色变化不是很多(只有3种颜色,其次变化顺序固定,red-->blue-->green)
但是试想,如果我们有这样的需求: 要求一共100中颜色之间进行转换,不仅要求从red-->blue,而且要求blue --> red, 那么State模式就是必要的。
State模式的实现方式:
- 定义一个State类
package state;
public abstract class State{
public abstract void forward(Context c);
public abstract void backward(Context c);
public abstract String getcolor();
}
- 将每个状态定义为一个State子类
package state;
public class BlueState extends State {
public String getcolor(){
return "blue";
}
@Override
public void forward(Context c) {
// TODO Auto-generated method stub
c.setState(new GreenState());
}
@Override
public void backward(Context c) {
// TODO Auto-generated method stub
c.setState(new RedState());
}
}
- 定义Context类
package state;
public class Context {
private State state = null;
public void setState(State state) {
this.state = state;
}
public void forward() {
state.forward(this);
}
public void pull() {
state.backward(this);
}
}
- 实际调用,只需要通过Context类就可以自行完成状态的转换。
- 使用经典案例:
A. 银行账户状态切换。
B. TCP Connection 状态切换。
C. E-Mail里面各种状态的切换。
D. 各种绘图程序。