状态模式:
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
当然如果这个判断逻辑很简单,就没必要用“状态模式了”
结构图:
State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为
1 public abstract class State { 2 public abstract void Handle(Context context); 3 }
ConcreteState类,具体的状态,每一个子类实现一个Context的状态相关行为
1 public class ConcreteStateA extends State{ 2 @Override 3 public void Handle(Context context) { 4 context.setState(new ConcreteStateB()); 5 } 6 }
1 public class ConcreteStateB extends State { 2 @Override 3 public void Handle(Context context) { 4 context.setState(new ConcreteStateC()); 5 } 6 }
1 public class ConcreteStateC extends State{ 2 @Override 3 public void Handle(Context context) { 4 context.setState(new ConcreteStateA()); 5 } 6 }
Context类,维护一个子ConcreteState子类的实例,这个实例定义当前的状态
1 public class Context { 2 private State state; 3 4 /**定义Context初始状态*/ 5 public Context(State state) { 6 this.state = state; 7 } 8 9 /**读写状态属性,用于读取当前属性和设置新的属性*/ 10 public State getState() { 11 return state; 12 } 13 14 public void setState(State state) { 15 System.out.println("state=="+state.getClass()); 16 this.state = state; 17 } 18 19 public void Request(){ 20 state.Handle(this); //对请求处理,并设置下一个状态 21 } 22 }
测试代码
1 public class StateMain { 2 public static void main(String[] args) { 3 Context c = new Context(new ConcreteStateA()); 4 //不断请求,同时更改状态 5 c.Request(); 6 c.Request(); 7 c.Request(); 8 } 9 }