用于解决系统中复杂对象的状态转换以及不一样状态下行为的封装问题。ide
结构:测试
(1)Context 环境类spa
环境类中维护一个 State 对象,它定义了当前的状态。线程
(2)State 抽象状态类code
(3)ConcreteState 具体状态类对象
每个类封装了一个状态对应的行为。blog
酒店系统中,房间的状态变化:接口
(1)空闲状态开发
(2)已预订状态class
(3)已入住状态
当遇到须要频繁修改状态的情况时,就能够考虑使用状态模式。
1 /** 2 * 状态接口 3 * @author CL 4 * 5 */ 6 public interface State { 7 void handle(); 8 }
1 /** 2 * 房间空闲状态 3 * @author CL 4 * 5 */ 6 public class FreeState implements State { 7 8 @Override 9 public void handle() { 10 System.out.println("房间空闲,能够预约!"); 11 } 12 13 }
1 /** 2 * 房间预约状态 3 * @author CL 4 * 5 */ 6 public class BookedState implements State { 7 8 @Override 9 public void handle() { 10 System.out.println("房间已预订,能够入住!"); 11 } 12 13 }
1 /** 2 * 房间已入住状态 3 * @author CL 4 * 5 */ 6 public class CheckedInState implements State { 7 8 @Override 9 public void handle() { 10 System.out.println("房间已入住,不能预约!"); 11 } 12 13 }
测试:
1 /** 2 * 测试状态模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 HomeContext hc = new HomeContext(); 10 11 //修改成空闲状态 12 hc.setState(new FreeState()); 13 14 //修改成已预订状态 15 hc.setState(new BookedState()); 16 17 //修改成已入住状态 18 hc.setState(new CheckedInState()); 19 } 20 }
控制台输出:
修改状态:房间空闲,能够预约!
修改状态:房间已预订,能够入住!
修改状态:房间已入住,不能预约!
(1)银行系统中帐号状态的管理;
(2)OA 系统中公文状态的管理;
(3)酒店系统中,房间状态的管理;
(4)线程对象各状态之间的切换;
(5)…………