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

总结

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

相关推荐
suaizai_1 小时前
Fastjson高危漏洞紧急修复指南
spring boot
Java牛马4 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌4 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
SomeB1oody4 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
东小西5 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
Profile排查笔记5 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户938515635075 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
mqiqe5 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情6 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学6 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang