【计划模式】三十一、状态模式

打印 上一主题 下一主题

主题 951|帖子 951|积分 2853

系列文章|源码

https://github.com/tyronczt/design-mode-learn

  
一、模式焦点头脑

状态模式(State Pattern)是一种行为型计划模式,允许对象在其内部状态改变时改变自身行为。其焦点头脑是将对象的状态抽象为独立类,通过委托状态对象处理与状态相关的逻辑,从而消除复杂的条件判断语句(如if-else或switch-case),提升代码的可维护性和扩展性。
二、模式布局

状态模式包罗三个焦点角色:
角色职责Java实现示例Context(上下文)维护当前状态对象的引用,并将状态相关操作委托给具体状态类持有State接口实例,提供状态切换方法(如setState())State(状态接口)定义状态行为的抽象方法,约束具体状态类的实现接口或抽象类(如OrderState接口定义handleState()方法)ConcreteState(具体状态)实现特定状态下的行为逻辑,并触发状态转换实现State接口的类(如PayOrder处理付出状态逻辑)

三、Java代码示例:订单状态管理

以下是一个简化的订单状态流转示例,展示状态模式的现实应用:
1. 定义状态接口

  1. public interface IOrderState {
  2.     /**
  3.      * 处理订单上下文
  4.      */
  5.     void handle(OrderContext context);
  6. }
复制代码
2. 实现具体状态类

  1. // 待支付状态
  2. public class PendingPaymentState implements IOrderState {
  3.     // 实现接口中的handle方法
  4.     @Override
  5.     public void handle(OrderContext context) {
  6.         System.out.println("订单待支付,跳转支付页面...");
  7.         context.setState(new PaidState()); // 状态切换
  8.     }
  9. }
  10. // 已支付状态
  11. public class PaidState implements IOrderState {
  12.     @Override
  13.     public void handle(OrderContext context) {
  14.         System.out.println("订单已支付,准备发货...");
  15.         context.setState(new ShippedState());
  16.     }
  17. }
  18. // 已发货状态
  19. public class ShippedState implements IOrderState {
  20.     @Override
  21.     public void handle(OrderContext context) {
  22.         System.out.println("订单已发货,待收货...");
  23.     }
  24. }
复制代码
3. 上下文类(Context)

  1. public class OrderContext {
  2.     private IOrderState state;
  3.     public void setState(IOrderState state) {
  4.         this.state = state;
  5.     }
  6.     public void process() {
  7.         state.handle(this);
  8.     }
  9. }
复制代码
4. 客户端调用

  1. public class Client {
  2.     public static void main(String[] args) {
  3.         // 创建一个订单上下文实例
  4.         OrderContext order = new OrderContext();
  5.         // 设置订单的初始状态为待支付
  6.         order.setState(new PendingPaymentState());
  7.         order.process(); // 输出:订单待支付,跳转支付页面...
  8.         order.process(); // 输出:订单已支付,准备发货...
  9.         order.process(); // 输出:订单已发货,待收货...
  10.     }
  11. }
复制代码
5. 运行截图


四、状态模式的焦点上风

1. 消除复杂条件分支

问题:传统方式需通过大量if-else判断当前状态(如订单状态),代码臃肿且难以维护。
解决:每个状态封装独立类,逻辑清楚(如PendingState仅处理待付出逻辑)。
2. 高扩展性与维护性

新增状态:只需添加新状态类(如新增CanceledState),无需修改现有代码。
修改行为:仅需调解对应状态类的逻辑,避免牵一发而动全身。
3. 符合开闭原则(OCP)

• 对扩睁开放:新状态不影响原有系统。
• 对修改关闭:上下文类无需因状态增减而改动。
4. 状态转换显式化

• 状态流转由具体状态类控制(如PaidState触发向ShippedState的转换),逻辑集中且透明。
5. 提升代码复用性

• 公共逻辑可抽取至抽象类(如状态切换的公共方法),淘汰重复代码。
五、适用场景


  • 多状态对象:如订单状态(待付出/已发货)、任务状态(举行中/已完成)。
  • 行为依靠状态:如游戏角色状态(攻击/防御)触发差异动作。
  • 需动态切换逻辑:如电梯运行状态(上行/停止)对应差异控制规则。
六、与其他模式的协作

战略模式:状态模式夸大状态驱动行为,战略模式侧重算法选择(如加密算法切换)。
观察者模式:结合使用可实现状态变更实时通知(如订单状态更新触发邮件通知)。
七、总结

状态模式通过解耦状态与行为,解决了复杂状态逻辑的维护难题。其上风在Java中尤为突出,结合接口和多态特性,能高效实现灵活的状态管理。现实开辟中,建议在状态较多或流转复杂的场景(如电商、游戏)优先接纳此模式。
   项目代码:https://github.com/tyronczt/design-mode-learn/tree/main/design-mode-learn-31
  参考

7.状态计划模式 - 掘金
状态计划模式

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表