开发中常见的场景

  • 银行系统中账号状态的管理

  • OA系统中公文状态的管理

  • 线程对象各状态之间的切换

场景

  • 电梯的运行

    • 维修,正常,自动关门,自动开门,向上运行,向下运行,消防状态
  • 红绿灯

    • 红灯,黄灯,绿灯
  • 企业或政府系统

    • 公文的审批状态

      • 报销单据审批状态

      • 假条审批

  • 网上购物时,订单的状态

    • 下单

    • 已付款

    • 已发货

    • 送货中

    • 以收货

核心

  • 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题

结构

  • Context环境类

    • 环境类中维护一个State对象,他定义了当前的状态
  • State抽象状态类

  • ConcreteState具体状态类

    • 每一个封装了一个状态的行为

QQ截图20161219100810.png

Code

/**
 * 状态接口
 * @author Matrix42
 *
 */
public interface State {
    void handle();
}
/**
 * 上下文类
 * @author Matrix42
 *
 */
public class Context {
    private State state;

    public void setState(State s){
        System.out.println("修改状态!");
        state = s;
        state.handle();
    }
}
/**
 * 空闲状态
 * @author Matrix42
 *
 */
public class FreeState implements State{

    @Override
    public void handle() {
        System.out.println("房间空闲!没人入住!");
    }

}
/**
 * 已预订状态
 * @author Matrix42
 *
 */
public class BookedState implements State{

    @Override
    public void handle() {
        System.out.println("房间已预订!");
    }

}
/**
 * 已入住状态
 * @author Matrix42
 *
 */
public class ChechedInState implements State{

    @Override
    public void handle() {
        System.out.println("房间已入住!请勿打扰!");
    }

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