【设计模式】行为型-状态模式

张开发
2026/6/8 21:10:49 15 分钟阅读
【设计模式】行为型-状态模式
文章目录前言一、概念二、核心结构三、Java 代码实现订单状态流转1. 抽象状态2. 具体状态待支付3. 具体状态已支付4. 具体状态已发货5. 具体状态已完成6. 上下文订单7. 客户端测试四、状态模式 VS 策略模式高频面试五、优缺点优点缺点六、应用场景七、总结前言开发中经常遇到对象行为随状态不同而变化的场景订单待支付/已支付/已发货/已完成、线程新建/就绪/运行/阻塞/结束、电梯开门/关门/运行/停止。如果用大量if-else/switch判断状态代码臃肿、难以维护、极易出错。状态模式就是专门解决多状态多行为、状态流转复杂的行为型设计模式。一、概念状态模式State Pattern是一种行为型设计模式核心思想允许对象在内部状态改变时改变其行为对象看起来好像修改了它的类。简单理解把每种状态封装成独立的状态类状态不同行为完全不同状态切换由状态自身或上下文管理彻底消灭if-else/switch。一句话总结状态决定行为状态变行为就变。二、核心结构Context上下文维护当前状态将请求委托给当前状态处理。State抽象状态定义状态对应的行为接口。ConcreteState具体状态实现各自状态下的行为并负责状态切换。三、Java 代码实现订单状态流转订单状态流转待支付 → 已支付 → 已发货 → 已完成1. 抽象状态publicinterfaceOrderState{voidhandle(OrderContextcontext);}2. 具体状态待支付publicclassWaitPayStateimplementsOrderState{Overridepublicvoidhandle(OrderContextcontext){System.out.println(当前状态待支付 → 执行支付逻辑);context.setState(newPaidState());// 切换为已支付}}3. 具体状态已支付publicclassPaidStateimplementsOrderState{Overridepublicvoidhandle(OrderContextcontext){System.out.println(当前状态已支付 → 发货);context.setState(newDeliverState());// 切换为已发货}}4. 具体状态已发货publicclassDeliverStateimplementsOrderState{Overridepublicvoidhandle(OrderContextcontext){System.out.println(当前状态已发货 → 确认收货);context.setState(newFinishState());// 切换为已完成}}5. 具体状态已完成publicclassFinishStateimplementsOrderState{Overridepublicvoidhandle(OrderContextcontext){System.out.println(当前状态已完成 → 订单结束);// 无后续状态}}6. 上下文订单publicclassOrderContext{privateOrderStatestate;publicOrderContext(){// 初始状态待支付statenewWaitPayState();}publicvoidsetState(OrderStatestate){this.statestate;}// 执行当前状态行为publicvoidprocess(){state.handle(this);}}7. 客户端测试publicclassClient{publicstaticvoidmain(String[]args){OrderContextordernewOrderContext();order.process();// 待支付 → 已支付order.process();// 已支付 → 已发货order.process();// 已发货 → 已完成order.process();// 已完成}}输出当前状态待支付 → 执行支付逻辑 当前状态已支付 → 发货 当前状态已发货 → 确认收货 当前状态已完成 → 订单结束四、状态模式 VS 策略模式高频面试对比点状态模式策略模式关注点状态流转、行为随状态自动变化算法可互换、平级替换切换方式状态自动切换客户端主动设置关系状态之间有流转依赖策略之间平等独立典型场景订单状态、线程状态、电梯状态支付、促销、排序五、优缺点优点消除大量 if-else/switch结构清晰状态职责集中每个状态只做自己的事状态切换安全、可控符合开闭原则新增状态只需加类缺点状态多会导致类数量爆炸状态流转复杂时设计难度上升六、应用场景订单状态、支付状态、物流状态线程生命周期NEW/RUNNABLE/BLOCKED/…电梯、门、游戏角色状态工作流、审批流状态UI 控件状态可用/禁用/聚焦经典框架Spring StatemachineQuartz 任务状态Netty pipeline 状态七、总结状态模式 状态封装 行为随状态自动变化核心状态决定行为状态变行为就变结构ContextState 具体状态类最适合多状态、多行为、状态流转复杂场景

更多文章