状态模式+观察者(监听器模式)实现订单状态变更

目录

项目需求概述

开发任务

开发

引入依赖

状态相关枚举

创建配置类

事件监听类


项目需求概述

用户从开始下订单,到支付完成,再到物流部进行发货,最终用户确认收货

整个流程涉及到很多订单状态,需要通过代码对订单状态进行管理。

除此之外,用户或者物流部分每一次触发的不同操作,都有可能改变订单状态。

如:

用户创建订单操作导致订单状态为待支付状态

用户支付操作导致订单状态变为待发货状态

物流部门发货操作导致订单状态变为待收货状态

用户确认收货操作导致订单状态变为订单完成状态

开发任务

设计整体结算发货以及收货的流程

用户创建订单-> 支付订单->发货->收货->订单完成

要求:

创建订单完成后,订单状态初始化为待支付

订单状态包括:待支付;待发货;待收货;订单完成(状态模式)

触发订单状态变化的操作:支付订单;发货;确认收货(观察者模式)

开发

使用Spring里面的状态机

监听器实际都是用框架实现,不会手写

引入依赖

org.springframework.statemachinespring-statemachine-core2.1.3.RELEASE

状态相关枚举

/*** 订单状态枚举*/
public enum OrderState {/*** 待支付*/ORDER_WAIT_PAY,/*** 待发货*/ORDER_WAIT_SEND,/*** 待收货*/ORDER_WAIT_RECEIVE,/*** 完成订单*/ORDER_FINISH
}/*** 订单状态转换关系*/
public enum OrderStateChangeAction {/*** 支付操作*/PAY_ORDER,/*** 发货操作*/SEND_ORDER,/*** 收货操作*/RECEIVE_ORDER
}@Data
public class Order {private Integer orderId;private OrderState orderState;
}

创建配置类


/*** @author chongfayi*/
@Configuration
@EnableStateMachine(name = "orderStateMachine")
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter {@Overridepublic void configure(StateMachineStateConfigurer states) throws Exception {states.withStates().initial(OrderState.ORDER_WAIT_PAY).states(EnumSet.allOf(OrderState.class));}@Overridepublic void configure(StateMachineTransitionConfigurer transitions) throws Exception {transitions.withExternal().source(OrderState.ORDER_WAIT_PAY).target(OrderState.ORDER_WAIT_SEND).event(OrderStateChangeAction.PAY_ORDER).and().withExternal().source(OrderState.ORDER_WAIT_SEND).target(OrderState.ORDER_WAIT_RECEIVE).event(OrderStateChangeAction.SEND_ORDER).and().withExternal().source(OrderState.ORDER_WAIT_RECEIVE).target(OrderState.ORDER_FINISH).event(OrderStateChangeAction.RECEIVE_ORDER);}@Beanpublic DefaultStateMachinePersister machinePersister() {return new DefaultStateMachinePersister(new StateMachinePersist() {@Overridepublic void write(StateMachineContext stateMachineContext, Order order) throws Exception {//通过任何方式进行持久化,MYSQL Redis 等}@Overridepublic StateMachineContext read(Order order) throws Exception {return new DefaultStateMachineContext(order.getOrderState(), null, null, null);}});}}

事件监听类

/*** 监听器是监听到 action 后进行状态的一个变更*/
@Component("orderStateListener")
@WithStateMachine(name = "orderStateMachine")
public class OrderStateListener {@OnTransition(source = "ORDER_WAIT_PAY",target = "ORDER_WAIT_SEND")public Boolean payToSend(Message message){Order order = (Order) message.getHeaders().get("order");order.setOrderState(OrderState.ORDER_WAIT_SEND);return true;}@OnTransition(source = "ORDER_WAIT_SEND",target = "ORDER_WAIT_RECEIVE")public Boolean sendToReceive(Message message){Order order = (Order) message.getHeaders().get("order");order.setOrderState(OrderState.ORDER_WAIT_RECEIVE);return true;}@OnTransition(source = "ORDER_WAIT_RECEIVE",target = "ORDER_FINISH")public Boolean receiveToFinish(Message message){Order order = (Order) message.getHeaders().get("order");order.setOrderState(OrderState.ORDER_FINISH);return true;}
}

实际项目运用之State模式(状态模式)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部