<<设计模式之禅(第二版)>>——第二十

2016-10-23  本文已影响10人  leiiiooo
定义:
状态模式通用类图

State——接口或者抽象类,负责对象状态的定义,并且封装环境角色以实现状态切换
ConcreteState——每一个具体状态角色必须完成两个职责,本状态的行为管理以及趋向状态管理(即如何过渡到下一个状态)
Context——定义客户端需要的接口,并且负责具体的切换

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();   
}
public class ConcreteStateOne extends State {

  @Override
  public void handle1() {
    // TODO Auto-generated method stub
    // 自身状态下必须处理的逻辑
  }

  @Override
  public void handle2() {
    // TODO Auto-generated method stub
    //更改当前的状态为状态2
    super.context.setCurrContext(Context.STATE2);
    //过渡到state2,由Context实现
    super.context.handle2();
  }

}
public class ConcreteStateTwo extends State {

  @Override
  public void handle1() {
    // TODO Auto-generated method stub
    // 通过Context进行状态的改变,并采取相应的行为
    super.context.setCurrContext(Context.STATE1);
    super.context.handle1();
  }

  @Override
  public void handle2() {
    // TODO Auto-generated method stub
    // 自身状态的逻辑处理

  }

}

public class Context {
  /*
   * 环境角色不成文约束:
   * 1、把状态对象声明为静态常量,有几个状态对象就声明几个静态常量
   * 2、环境角色具有状态抽象角色定义的所有行为,具体执行使用委托方式
   */
  public static final State STATE2 = new ConcreteStateTwo();
  public static final State STATE1 = new ConcreteStateOne();

  // 定义当前的状态
  private State mCurrState;

  public void setCurrContext(State state) {
    // TODO Auto-generated method stub
    this.mCurrState = state;
    // 切换状态,使用此context封装当前状态
    this.mCurrState.setContext(this);
  }

  // 行为委托
  public void handle2() {
    // TODO Auto-generated method stub
    this.mCurrState.handle2();
  }

  public void handle1() {
    // TODO Auto-generated method stub
    this.mCurrState.handle1();
  }

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

    context.setCurrContext(new ConcreteStateOne());
    context.handle1();
    context.handle2();
    /*我们已经隐藏了状态的变化过程,
     * 它的切换引起了行为的切换,
     * 对我们来说我们只看到了行为的切换,
     * 而不用知道是状态变化引起的 */
  }
}
优点:
缺点:
使用场景:
上一篇 下一篇

猜你喜欢

热点阅读