纵有疾风起
人生不言弃

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

定义

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

状态模式的角色

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.jianshu.com/p/0152c88cd6eb

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » 设计模式二十二–状态模式
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录