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

总结

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

相关推荐
飞翔的佩奇5 分钟前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
懒洋洋大魔王11 分钟前
7.Java高级编程 多线程
java·开发语言·jvm
茶馆大橘16 分钟前
【黑马点评】已解决java.lang.NullPointerException异常
java·开发语言
星辰@Sea19 分钟前
服务注册中心对比及使用场景分析
java·云原生
马剑威(威哥爱编程)23 分钟前
除了递归算法,要如何优化实现文件搜索功能
java·开发语言·算法·递归算法·威哥爱编程·memoization
bug菌¹25 分钟前
滚雪球学SpringCloud[4.1讲]: Spring Cloud Gateway详解
java·spring cloud·微服务
MuseLss1 小时前
HashMap高频面试知识点
java·开发语言·哈希算法
tyler-泰勒1 小时前
初始c++:入门基础(完结)
java·开发语言·c++
重生之我要进大厂1 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
_祝你今天愉快1 小时前
技术成神之路:设计模式(十四)享元模式
java·设计模式