跳到主要内容

设计模式之状态模式

状态模式定义

状态模式(State Pattern)是指当某个类的状态变化极其复杂时,将其状态抽离成相应的类,并把状态变化的判断转移到相关的类中。该模式避免在一个类中完成复杂的逻辑判断,有利于对状态的增删改。如果对象行为依赖于不同的状态,而又频繁在运行时转换,即可使用。

状态模式的实现

// 用于管理当前的状态
public class Context {
// 需要变化的状态
public Integer status;
// 当前状态类
private State state;
public Context(){
// 默认状态
this.status = 1;
this.state = new StateEven();
}

public State getState() {
return state;
}

// 变化到相应的状态
public void setState(State state) {
this.state = state;
System.out.println("当前状态:"+this.state.name());
}

// 执行当前状态相应的方法
public void doAction(){
this.state.doAction(this);
}
}

// 抽象状态
public abstract class State {
public abstract String name();
public abstract void doAction(Context context);
}

public class StateEven extends State {
@Override
public String name() {
return "偶数状态";
}

@Override
public void doAction(Context context) {
// 按状态切换状态类
if (context.status % 2 == 0) {
System.out.println(context.status + "是偶数");
} else {
context.setState(new StateOdd());
context.doAction();
}
}
}

public class StateOdd extends State {
@Override
public String name() {
return "奇数状态";
}

@Override
public void doAction(Context context) {
// 按状态切换状态类
if(context.status % 2 != 0) {
System.out.println(context.status + "是奇数");
} else {
context.setState(new StateEven());
context.doAction();
}
}
}

测试:

public static void main(String[] args) throws Exception {
Context context = new Context();
context.status = 1;
context.doAction();
context.status = 2;
context.doAction();
}

结果:

当前状态:奇数状态
1是奇数
当前状态:偶数状态
2是偶数