状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。
策略模式和状态模式有点相似,区别就是状态模式是行为改变状态,主要在于状态改变行为的应用场景,而策略模式则是采用哪种算法,让Context去实现哪种算法,决定权在于客户端。状态模式的行为是平行的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的。
主要有三个角色:
环境角色(Context):保留客户端所需要的一些接口,并保留一个具体状态类的实例。
package design.state; public class Context { private State state; public void setState(State state) { this.state = state; } //定义客户端调用接口 public void request(String para){ state.handle(para); } }
抽象状态角色(State):作为一个接口,封装环境对象的一个特定的状态所对应的行为。
package design.state; public interface State { public void handle(String para); }
具体状态角色(ConcreteState):实现具体的接口定义行为。
package design.state; public class ConcreteStateA implements State{ @Override public void handle(String para) { System.out.println("ConcreteStateA handle:"+para); } }
package design.state; public class ConcreteStateB implements State{ @Override public void handle(String para) { System.out.println("ConcreteStateB handle:"+para); } }
测试
package design.state; public class Client { public static void main(String[] args) { //创建状态 State state=new ConcreteStateA(); State state1=new ConcreteStateB(); //创建环境 Context context=new Context(); //设置状态 context.setState(state); //请求 context.request("test"); //设置状态 context.setState(state1); //请求 context.request("test"); } }
结果
ConcreteStateA handle:test ConcreteStateB handle:test