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

总结

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

相关推荐
爱学习的程序媛2 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing2 小时前
Agent核心内容
后端·ai·langchain
budingxiaomoli3 小时前
Spring统一功能处理
java·后端·spring
某鹏4 小时前
网关选型:Go、Java、Graal 谁都不能完胜
后端
用户0247836530974 小时前
从屎山到防线:14 行状态迁移表,给任务系统装上防瞎跳闸门
后端
CQU_JIAKE5 小时前
11.13[体系结构】指标,五级流水线,八级流水线,虚实地址思考
后端
Flynn Liang5 小时前
可观测性与成本治理:一次对话的 17 个观测点
java·langchain·可观测性·micrometer·langchain4j·token 成本·llm 监控
金銀銅鐵5 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
panbook6 小时前
从0到1实现一个分布式时序数据库(三):主从复制、故障检测与切换
后端
上线再说6 小时前
图片从 8.2MB 压到 296KB:我把小程序图片链路的账单拆了一遍
后端