一、定义
当一个对象的内在状态改变时是允许改变其行为,这个对象看起来像是改变了其类。
状态模式只要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑判断简化。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为是,就可以考虑使用状态模式。
二、结构图
三、代码示例
1、状态模式测试代码Action.java
/**
* 测试状态模式
* @author lattice
*
*/
public class Action {
public static void main(String[] args) {
Context context=new Context(new ConcreteStateA());
context.request();
}
/**
* 输出结果:
请求处理前状态:com.lattice.state.ConcreteStateA
请求处理后状态:com.lattice.state.ConcreteStateB
*/
}
2、状态类State.java
/**
* 抽象状态类
* @author lattice
*
*/
public abstract class State {
public abstract void handle(Context context);
}
class ConcreteStateA extends State{
@Override
public void handle(Context context) {
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB extends State{
@Override
public void handle(Context context) {
context.setState(new ConcreteStateA());
}
}
/**
* 状态类维护类
* @author lattice
*
*/
class Context{
private State state;
public Context(State state){
this.state=state;
}
public void setState(State state){
this.state=state;
}
public State getState(){
return this.state;
}
public void request(){
System.out.println("请求处理前状态:"+this.state.getClass().getName());
this.state.handle(this);
System.out.println("请求处理后状态:"+this.state.getClass().getName());
}
}