业务场景
假设我们正在构建一个电商系统,需要处理用户的订单请求。当用户提交订单时,系统需要执行一系列检查和操作,比如验证库存、检查用户信用额度、确认支付方式等。如果所有检查都通过,则订单被创建;否则,根据失败的原因给出相应的反馈。
技术栈
- 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}
具体的处理者实现
-
库存检查
-
信用检查
-
支付方式检查
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
总结
在这个例子中,我们使用职责链模式实现了订单创建过程中的一系列检查。这种方式使我们的代码更易于维护和扩展,因为我们可以轻松地添加新的检查点或者改变检查的顺序。