GOF23设计模式之状态模式(state)
一、状态模式概述
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
结构:
(1)Context 环境类
环境类中维护一个 State 对象,它定义了当前的状态。
(2)State 抽象状态类
(3)ConcreteState 具体状态类
每一个类封装了一个状态对应的行为。
二、状态模式场景导入
酒店系统中,房间的状态变化:
(1)空闲状态
(2)已预订状态
(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)…………