Java 设计模式——状态模式(行为型设计模式)实战示例基于spring的状态机

本文介绍了一种使用配置文件驱动的状态机实现方式,以处理订单状态流转。状态流转步骤通过配置文件定义,每个状态对应一个业务接口,采用指令模式和策略模式进行控制。对外提供统一接口,通过桥接模式处理状态机流转。配置文件包含产品集合、状态集合、角色、指令等信息,业务逻辑在具体的服务实现类中。该方案旨在确保状态变更时,历史代码不受影响,仅需针对新状态开发。文章末尾提出了优化方向,如增加指令、支持产品状态组合等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:本文只是在个人实战中的示例,主要了解思想,代码可根据自己的具体情况进行调整,不是完整的demo代码。

背景说明

订单存在下单、支付、运输、完成等此类的状态流转,每一个状态下做不同的业务处理,状态存在变更的情况。
期望能够通过配置来实现状态变更时不影响历史代码并且不做变更,仅针对新状态进行业务开发即可。

方案说明

个人的解决方案是这样的,仅供参考:
1、状态具体的流转步骤通过配置文件完成
2、每个状态要做的业务逻辑面向接口开发
3、使用指令模式来进行控制
4、具体指令配置在配置文件中
5、指令就是状态code
6、通过策略模式进行封装仅对外暴露一个接口
7、通过桥连接模式将具体的状态机流转进行处理

代码

第一步、配置文件

  • 梳理自己所需要的状态,每一个状态code就是一个指令
  • 每一个指令对应了一个具体的业务接口实现类
  • 不同的产品可能有不同的状态流转,需要支持多产品集合

配置文件示例如下,代码仅供参考,可根据自己的业务进行不同的字段增减:
配置内容我写在了bootstrap.yml文件中了,根据自己的业务进行调整

#自定义状态机
statemachine:
  products: #产品集合
    - name: gome_cuohe #产品标识
      open: true #产品启用开关
      states: #产品状态集合
#角色分别为:系统(SYSTEM)、雇主(A)、服务商(B)
       - service: OrderStateMachineXXXServiceImpl #状态机需要执行的service
         roles: A,B#支持的角色
         instructions: xxx #指令
         des:  #描述

       - service: OrderStateMachineSelectYYYServiceImpl #状态机需要执行的service
         roles: B#支持的角色
         instructions: yyy #指令
         des:  #描述

创建对应配置内容的映射java类

@Data
@Configuration
@ConfigurationProperties(prefix = "statemachine")
public class StateMachineConfig {
   
    List<StateMachineProduct> products = Lists.newArrayList();
}
@Data
public class StateMachineProduct {
   
    String name;
    Boolean open;
    List<StateMachineProductState> states = Lists.newArrayList();
}
@Data
public class StateMachineProductState {
   
    String service;
    String roles;
    String instructions;
    String des;
}

第二步、定义状态机接口

状态机具体执行的service接口定义

<
### Spring状态的工程实现模式 Spring状态Spring State Machine)是一种基于有限状态理论的框架,旨在帮助开发者构建复杂的状态驱动应用程序。以下是关于其设计模式和实现方式的具体分析: #### 1. **状态模式** Spring状态的核心设计理念之一是利用状态模式来管理对象的行为变化。通过定义一组离散的状态以及它们之间的转换关系,可以清晰地描述系统的动态行为[^1]。 ```java // 定义状态枚举类 public enum States { STATE_ONE, STATE_TWO, STATE_THREE; } // 定义事件枚举类 public enum Events { EVENT_ONE, EVENT_TWO, EVENT_THREE; } ``` 上述代码展示了如何使用Java中的`enum`类型来表示状态和事件。这种做法不仅提高了可读性,还便于维护复杂的业务逻辑。 --- #### 2. **观察者模式** 在Spring状态中,当某个状态发生改变时,会通知所有注册的监听器执行相应的回调操作。这正是典型的观察者模式应用案例[^2]。 ```java @Component public class MyStateMachineListener implements StateMachineListener<States, Events> { @Override public void stateChanged(State<States, Events> from, State<States, Events> to) { System.out.println("State changed from " + from + " to " + to); } } ``` 此示例说明了如何创建自定义监听器以捕获并响应状态的变化过程。 --- #### 3. **模板方法模式** Spring状态提供了灵活的配置选项,允许开发人员通过扩展基类或覆盖默认行为来自定义功能。这一制体现了模板方法的设计理念[^3]。 ```xml <!-- 配置文件片段 --> <state id="STATE_ONE"> <transition on="EVENT_ONE" target="STATE_TWO"/> </state> ``` XML配置形式简化了状态转移规则的声明工作,同时也支持程序化的方式完成相同的目标。 --- #### 4. **工厂模式** 为了方便实例化各种组件和服务,Spring状态广泛采用了工厂模式。例如,在初始化过程中可以通过特定的方法获取预设好的状态实例[^4]。 ```java @Configuration @EnableStateMachineFactory public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> { @Override public void configure(StateMachineStateConfigurer<States, Events> states) throws Exception { states.withStates() .initial(States.STATE_ONE) .states(EnumSet.allOf(States.class)); } @Override public void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception { transitions.withExternal().source(States.STATE_ONE).target(States.STATE_TWO).event(Events.EVENT_ONE); } } ``` 以上代码片段演示了如何借助工厂Bean快速搭建完整的状态结构。 --- #### 总结 综上所述,Spring状态综合运用了多种经典设计模式,从而实现了高度模块化的架构体系。它既能够满足基本的需求场景,也具备足够的灵活性应对更加复杂的实际挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒菜-码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值