首页 > 代码库 > 设计模式之状态模式

设计模式之状态模式

1、定义

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类

2、通用类图


image

状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样。

State抽象状态角色:接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换

ConcreteState具体状态角色:每个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗的说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。

Context环境角色:定义客户端需要的接口,并且负责具体状态的切换。

3、通用源代码


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();    }}