状态模式:
场景:
电梯的运行:
维修,正常,自动关门,自动开门,向上运行,向下运行,消防状态
红绿灯
红灯,黄灯,绿灯
企业或政府系统
公文审批状态
报销单据审批状态
假条审批
网上购物时,订单的状态
下单
已付款
已发货
送货中
已收货
酒店系统中,房间的状态变化:
已预定
已入住
空闲
应用场景:
银行系统账户状态
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()); } }
/* 修改状态 空闲状态,可以入住 修改状态 已经预定,等待入住 * * */
原文地址:http://blog.csdn.net/lk142500/article/details/45101933