使用 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

总结

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

相关推荐
梦梦代码精9 小时前
《LikeShop全产品技术硬核拆解:ThinkPHP8+Vue3+UniApp架构,私有化部署与二次开发实战指南》
java·低代码·系统架构·php·开源软件
卷无止境9 小时前
当FastAPI遇上机器学习,一个脚手架工具能省下多少工夫
后端·python·fastapi
一木 之林9 小时前
C/C++ 面向对象编程(OOP)(进阶)
java·c语言·c++
卷无止境9 小时前
Kilo CLI 到底是什么
人工智能·后端·python
coderCN9 小时前
Nodejs 响应头和请求头
后端·node.js
SamDeepThinking9 小时前
里氏替换原则的盲区:为什么符合契约的List替换依然会失败?
后端·面试·程序员
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 2
java·spring boot·笔记
码事漫谈9 小时前
比尔·盖茨这次谈的不是模型,是账单
前端·后端
小林ixn10 小时前
从零设计一个博客系统的数据库:表结构、索引与约束的实战思考
数据库·后端·mysql
technology_x10 小时前
液冷超充站设备厂家哪家好?2026年功率与散热对比
java·开发语言