使用 Spring Boot 实现职责链模式处理电商订单流程

业务场景

假设我们正在构建一个电商系统,需要处理用户的订单请求。当用户提交订单时,系统需要执行一系列检查和操作,比如验证库存、检查用户信用额度、确认支付方式等。如果所有检查都通过,则订单被创建;否则,根据失败的原因给出相应的反馈。

技术栈

  • Spring Boot:版本 3.0 或更高
  • Java:版本 17 或更高

设计职责链模式

定义抽象处理者

首先,定义一个抽象的处理者接口,它包含处理请求的方法。

复制代码
java

深色版本

复制代码
1public interface OrderHandler {
2    void handle(Order order);
3}

创建具体处理者

然后,我们创建具体的处理者类,每个处理者负责特定的检查或操作。每个处理者需要知道下一个处理者是谁,以便能够将请求传递给下一个处理者。

复制代码
java

深色版本

复制代码
1public abstract class AbstractOrderHandler implements OrderHandler {
2
3    protected OrderHandler successor;
4
5    public AbstractOrderHandler(OrderHandler successor) {
6        this.successor = successor;
7    }
8
9    public void setSuccessor(OrderHandler successor) {
10        this.successor = successor;
11    }
12
13    @Override
14    public abstract void handle(Order order);
15}

具体的处理者实现

  1. 库存检查

  2. 信用检查

  3. 支付方式检查

    java

深色版本

复制代码
1public class StockCheckHandler extends AbstractOrderHandler {
2
3    @Override
4    public void handle(Order order) {
5        // 检查库存
6        if (!isStockAvailable(order)) {
7            order.setStatus(OrderStatus.STOCK_UNAVAILABLE);
8            System.out.println("Stock check failed.");
9            return;
10        }
11        // 如果库存检查通过,传递给下一个处理者
12        if (successor != null) {
13            successor.handle(order);
14        }
15    }
16
17    private boolean isStockAvailable(Order order) {
18        // 模拟库存检查
19        return Math.random() > 0.5;
20    }
21}
22
23public class CreditCheckHandler extends AbstractOrderHandler {
24
25    @Override
26    public void handle(Order order) {
27        // 检查信用额度
28        if (!hasCredit(order)) {
29            order.setStatus(OrderStatus.CREDIT_LIMIT_EXCEEDED);
30            System.out.println("Credit check failed.");
31            return;
32        }
33        // 如果信用检查通过,传递给下一个处理者
34        if (successor != null) {
35            successor.handle(order);
36        }
37    }
38
39    private boolean hasCredit(Order order) {
40        // 模拟信用检查
41        return Math.random() > 0.5;
42    }
43}
44
45public class PaymentMethodCheckHandler extends AbstractOrderHandler {
46
47    @Override
48    public void handle(Order order) {
49        // 检查支付方式
50        if (!isValidPaymentMethod(order)) {
51            order.setStatus(OrderStatus.PAYMENT_METHOD_INVALID);
52            System.out.println("Payment method check failed.");
53            return;
54        }
55        // 如果支付方式检查通过,订单创建完成
56        order.setStatus(OrderStatus.CREATED);
57        System.out.println("Order created successfully.");
58    }
59
60    private boolean isValidPaymentMethod(Order order) {
61        // 模拟支付方式检查
62        return Math.random() > 0.5;
63    }
64}

组装处理者链

接下来,我们需要创建一个服务类来组装处理者链。

复制代码
java

深色版本

复制代码
1@Service
2public class OrderService {
3
4    private final OrderHandler chain;
5
6    public OrderService(StockCheckHandler stockCheckHandler,
7                        CreditCheckHandler creditCheckHandler,
8                        PaymentMethodCheckHandler paymentMethodCheckHandler) {
9        this.chain = createChain(stockCheckHandler, creditCheckHandler, paymentMethodCheckHandler);
10    }
11
12    private OrderHandler createChain(OrderHandler... handlers) {
13        OrderHandler current = null;
14        for (OrderHandler handler : handlers) {
15            handler.setSuccessor(current);
16            current = handler;
17        }
18        return current;
19    }
20
21    public void processOrder(Order order) {
22        chain.handle(order);
23    }
24}

创建 REST 控制器

创建一个 REST 控制器来接收订单创建请求。

复制代码
java

深色版本

复制代码
1@RestController
2@RequestMapping("/api/orders")
3public class OrderController {
4
5    private final OrderService orderService;
6
7    @Autowired
8    public OrderController(OrderService orderService) {
9        this.orderService = orderService;
10    }
11
12    @PostMapping
13    public ResponseEntity<String> createOrder(@RequestBody Order order) {
14        orderService.processOrder(order);
15        return new ResponseEntity<>("Order processed", HttpStatus.OK);
16    }
17}

测试

启动 Spring Boot 应用,并发送一个 POST 请求来测试订单创建流程。

复制代码
bash

深色版本

复制代码
1curl -X POST -H "Content-Type: application/json" -d '{"productId":1,"quantity":1}' http://localhost:8080/api/orders

总结

在这个例子中,我们使用职责链模式实现了订单创建过程中的一系列检查。这种方式使我们的代码更易于维护和扩展,因为我们可以轻松地添加新的检查点或者改变检查的顺序。

相关推荐
指令集梦境28 分钟前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
摇滚侠1 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea
VidDown1 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
码云之上1 小时前
聊聊如何设计一个高效、稳定的 Node.js 接入层
前端·后端·node.js
折哥的程序人生 · 物流技术专研1 小时前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则
装不满的克莱因瓶1 小时前
基于 OpenResty 扩展开发实现动态服务注册与发现能力
java·开发语言·架构·openresty
程序员小羊!2 小时前
06Java 异常机制与常用类
java
weixin_523185322 小时前
Java基础知识总结(四):引用数据类型与参数传递机制
java·开发语言·python
IT_陈寒2 小时前
Vite项目build后路由404了?你可能漏了这个小配置
前端·人工智能·后端
宸津-代码粉碎机3 小时前
Spring AI企业级实战|从RAG优化到Agent多工具调度
java·大数据·人工智能·后端·python·spring