允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类
状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样。
State抽象状态角色:接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换
ConcreteState具体状态角色:每个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗的说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。
Context环境角色:定义客户端需要的接口,并且负责具体状态的切换。
package State; public abstract class State { //定义一个环境角色,提供子类访问 protected Context context; //设置环境角色 public void setContext(Context context){ this.context=context; } //行为1 public abstract void handle1(); //行为2 public abstract void handle2(); }
package State; public class ConcreteState2 extends State{ @Override public void handle1() { //本状态下必须处理的逻辑 } @Override public void handle2() { //设置当前状态为stat2 super.context.setCurrentState(Context.STATE2); //过渡到state2状态,由Context实现 super.context.handle2(); } }
package State; public class ConcreteState1 extends State{ @Override public void handle1() { //设置当前状态为stat1 super.context.setCurrentState(Context.STATE1); //过渡到state1状态,由Context实现 super.context.handle1(); } @Override public void handle2() { //本状态下必须处理的逻辑 } }
package State; public class Context { //状态定义 public final static State STATE1=new ConcreteState1(); public final static State STATE2=new ConcreteState2(); //当前状态 private State CurrentState; //获得当前状态 public State getCurrentState(){ return CurrentState; } //设置当前状态 public void setCurrentState(State currentState){ this.CurrentState=currentState; //切换状态 this.CurrentState.setContext(this); } //行为委托 public void handle1(){ this.CurrentState.handle1(); } public void handle2(){ this.CurrentState.handle2(); } }
package State; public class Main { public static void main(String[] args){ //定义环境变量 Context context=new Context(); //初始化状态 context.setCurrentState(new ConcreteState1()); //行为执行 context.handle1(); context.handle2(); } }
原文:http://www.cnblogs.com/limiracle/p/3921660.html