java设计模式笔记

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

2019-04-03  本文已影响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)

上一篇下一篇

猜你喜欢

热点阅读