美文网首页java设计模式笔记
设计模式二十二--状态模式

设计模式二十二--状态模式

作者: 朽木亦自雕 | 来源:发表于2019-04-03 14:19 被阅读0次

    定义

    当一个状态在内部状态改变时允许改变行为,这个对象看起来像改变了类型。

    状态模式的角色

    1:抽象状态角色(State)
    该角色用以封装环境对象的一个特定状态对应的行为。

    public abstract class State{
      protected Context context;
      public void setContext(Context context){
        this.context = context;
      }
      public abstract void handle();
    }
    

    2:具体状态角色(ConcreteState)
    该角色实现环境的一个状态所对应的行为。

    public class ConcreteState1 extends State{
      @Override
      public void handle(){
        System.out.println("行为1")
      }
    }
    public class ConcreteState2 extends State{
      @Override
      public void handle(){
        System.out.println("行为2")
      }
    }
    

    3:环境角色(Context)
    该角色定义客户端需要的接口,并负责具体状态切换,它会保留一个具体状态类的实例,该实例给出环境对象的现有状态。

    public class Context{
      public static State STATE1 = new ConcreteState1();
      public static State STATE2 = new ConcreteState2();
    
      private State currentState;
    
      public State getCurrentState(){
        return this.currentState;
      }
      public void setCurrentState(State currentState){
        this.currentState = currentState;
      }
      public void handle1(){
        tis.setCurrentState(STATE1);
        this.currentState.handle();
      }
      public void handle2(){
        this.setCurrentState(STATE2);
        this.currentState.handle();
      }
    }
    

    客户端代码:

    public class Client{
      public static void main(String [] args){
        Context context = new Context();
        context.handle1();
        context.handle2();
      }
    }
    

    优点

    1:结构清晰。
    2:遵循设计模式。
    3:封装性非常好。

    缺点

    子类太多,不易于管理。需要对每一个可能取得的状态,创建一个子类,并且要在Context中创建对应的调用handle方法。

    使用场景

    1:对象的行为依赖于它所处的状态,即行为随着状态改变的场景。
    2:对象在某个方法中依赖于一重或者多重分支语句,此时可以使用状态模式,将分支语句中的每一个分支都包装到一个单独的类中,使得这些条件语句能够以类的方式独立存在和演化。

    参考资料:设计模式(java)

    相关文章

      网友评论

        本文标题:设计模式二十二--状态模式

        本文链接:https://www.haomeiwen.com/subject/kxtclqtx.html