状态模式
前言
- 核心
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题 - 结构
环境角色(Context):环境类中维护一个State对象,定义了当前的状态。
抽象状态角色(State):定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
具体状态角色(ConcreteState):每一个具体状态类都实现了环境的一个状态所对应的行为。
一、具体实现
例如:酒店系统中,房间的状态变化:已预订、已入住、空
1.环境角色
/**
* 房间对象
* @author Administrator
*
*/
public class HomeContext {
//如果是银行系统,这个Context类就是账号。根据金额不同,切换不同的状态!
private State state;
public void setState(State s){
System.out.println("修改状态!");
state = s;
state.handle();
}
}
2.抽象状态角色
public interface State {
void handle();
}
3.具体状态角色
/**
* 已入住状态
* @author Administrator
*
*/
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房间已入住!请勿打扰!");
}
}
/**
* 已预订状态
* @author Administrator
*
*/
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房间已预订!别人不能定!");
}
}
/**
* 空闲状态
* @author Administrator
*
*/
public class FreeState implements State {
@Override
public void handle() {
System.out.println("房间空闲!!!没人住!");
}
}
4.测试类
public class Client {
public static void main(String[] args) {
HomeContext ctx = new HomeContext();
ctx.setState(new FreeState());
ctx.setState(new BookedState());
}
}
结果:
二、应用场景
- 银行系统中账号状态的管理
- OA系统中公文状态的管理
- 酒店系统中,房间状态的管理
- 线程对象各状态之间的切换
总结
- 优点
1.避免了为判断状态而产生的巨大的if或case语句。
2.将对象行为交给状态类维护后,对于上层程序而言,仅需要维护状态之间的转换规则。 - 缺点
会导致某些系统有过多的具体状态类 - 场景
1.电梯的运行
• 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态
2.红绿灯
• 红灯、黄灯、绿灯
3.企业或政府系统
• 公文的审批状态
– 报销单据审批状态– 假条审批
4.网上购物时,订单的状态
• 下单
• 已付款
• 已发货
• 送货中
• 已收