UML类图
应用场景
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到不同一系列类当中,可以把复杂的判断逻辑简化。简单来说,当程序中存在大量if-else if-else结果或switch结构时,且每个结构中存在大量代码时,则可使用状态模式。为了灵活控制分钟结构中的代码,有时候需要增加分支,有时候需要减少分支,并且如果将大量的代码写入到一个if-else中,是难以维护的,一种简单的做法是将其封装成函数,通过if-else判断调用不同的函数即可,但该方法依然不能实现模块化。
代码实现
没有使用状态模式的结构:
public class Main {
public static void main(String[] args) {
int flag = 1;
switch(flag){
case 0:
System.out.println("flag is 0");
//省略其他大量的业务代码
break;
case 1:
System.out.println("flag is 1");
//省略其他大量的业务代码
break;
case 2:
//省略其他大量的业务代码
System.out.println("flag is 2");
break;
}
}
}
输出结果:flag is 1
使用状态模式:
State类,将逻辑块抽象出来,封装成handle方法
public interface State {
public void handle(Context context);
}
Context类,主要负责调度State的handle方法以及保存条件值
public class Context {
private State state;
private int flag;
public void setFlag(int flag){
this.flag = flag;
}
public int getFlag(){
return this.flag;
}
public Context(State state,int flag){
this.state = state;
this.flag = flag;
}
public void setState(State state){
this.state = state;
}
public void request(){
state.handle(this);
}
}
具体的状态类
public class ConcreteStateA implements State{
@Override
public void handle(Context context) {
if(context.getFlag() == 0){
System.out.println("flag is 0 and state is A");
//这里可以是其他很多逻辑
}else{
context.setState(new ConcreteStateB());
context.request();
}
}
}
public class ConcreteStateB implements State{
@Override
public void handle(Context context) {
if(context.getFlag() == 1){
System.out.println("flag is 1 and state is B");
//这里可以是其他很多逻辑
}else{
context.setState(new ConcreteStateC());
context.request();
}
}
}
public class ConcreteStateC implements State{
@Override
public void handle(Context context) {
if(context.getFlag() == 2){
System.out.println("flag is 2 and state is C");
//这里可以是更多的其他逻辑
}
}
}
Main客户端
public class Main {
public static void main(String[] args) {
Context context = new Context(new ConcreteStateA(), 1);
context.request();
int flag = 1;
}
}
输出结果:flag is 1 and state is B