状态模式:
场景:
电梯的运行:
维修,正常,自动关门,自动开门,向上运行,向下运行,消防状态
红绿灯
红灯,黄灯,绿灯
企业或政府系统
公文审批状态
报销单据审批状态
假条审批
网上购物时,订单的状态
下单
已付款
已发货
送货中
已收货
酒店系统中,房间的状态变化:
已预定
已入住
空闲
应用场景:
银行系统账户状态
OA系统中公文状态的管理
酒店系统中房间状态的管理
线程对象各状态的作用
=========================================
/**
* 状态类:
*/
package com.bjsxt.cn.state;
public interface State {
public void handle();
}
=============================================================
/**
* 已经预定状态
*/
package com.bjsxt.cn.state;
public class BookedState implements State {
@Override
public void handle() {
System.out.println("已经预定,等待入住");
}
}
============================================================
/**
* 已经入住状态
* 2015年4月17日20:20:20
*/
package com.bjsxt.cn.state;
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("已经入住");
}
}
==============================================================
/**
* 表征的空闲状态
* 2015年4月17日20:16:58
*/
package com.bjsxt.cn.state;
public class FreeState implements State {
@Override
public void handle() {
System.out.println("空闲状态,可以入住");
}
}
=============================================================
/**
* 房间上下文,持有状态成员变量。
* 2015年4月17日20:21:21
*/
package com.bjsxt.cn.state;
public class HouseContext {
private State state;
public HouseContext() {
}
public void setState(State state) {
System.out.println("修改状态");
this.state = state;
state.handle();
}
}
===========================================================
/**
* 测试程序:测试状态模式的代码
* 状态模式多用在一个东西具有多个状态。状态切换的时候在传统上我们使用的是if结构,
* 但是这种结构有着致命的问题,但还是同样的问题,后期不利于维护,尤其是在状态奇幻的时候需要
* 更改原有代码违法开闭原则。
*
*/
package com.bjsxt.cn.state;
public class Client {
public static void main(String[] args) {
HouseContext ctx = new HouseContext();
ctx.setState(new FreeState());
ctx.setState(new BookedState());
}
}
/*
修改状态
空闲状态,可以入住
修改状态
已经预定,等待入住
*
* */