Spring Boot 責(zé)任鏈模式:提升應(yīng)用靈活性
引言
責(zé)任鏈模式定義了一種松散耦合的方式來處理請求。它創(chuàng)建了一個接收者對象的鏈,每個接收者都包含對下一個接收者的引用。這樣,客戶端只需要向鏈中的第一個接收者發(fā)送請求,然后由鏈上的接收者依次判斷是否處理該請求或者繼續(xù)傳遞給下一個接收者。
圖片
本文將探討如何在Spring Boot項目中巧妙地應(yīng)用責(zé)任鏈模式來構(gòu)建更加靈活、易于擴展的應(yīng)用架構(gòu),并通過一個完整的訂單處理流程案例展示其強大之處。
代碼實踐
首先,我們需要定義一個通用的處理器接口,所有具體的處理器都將實現(xiàn)這個接口。
public interface OrderHandler {
void setNext(OrderHandler next);
void handle(OrderEntity order);
}
接下來,根據(jù)業(yè)務(wù)需求創(chuàng)建不同的處理器類,比如支付驗證、庫存檢查、發(fā)貨準(zhǔn)備等。
@Order(1)
@Component
public class PaymentVerificationHandler implements OrderHandler {
private OrderHandler next;
@Override
public void setNext(OrderHandler next) {
this.next = next;
}
@Override
public void handle(OrderEntity order) {
// 模擬支付驗證邏輯
if (order.isPaymentValid()) {
System.out.println("支付驗證通過");
if (next != null) {
next.handle(order);
}
} else {
System.out.println("支付失敗");
}
}
}
@Order(2)
@Component
public class InventoryCheckHandler implements OrderHandler {
private OrderHandler next;
@Override
public void setNext(OrderHandler next) {
this.next = next;
}
@Override
public void handle(OrderEntity order) {
// 模擬庫存檢查邏輯
if (order.isInventoryAvailable()) {
System.out.println("庫存充足");
if (next != null) {
next.handle(order);
}
} else {
System.out.println("庫存不足");
}
}
}
@Order(3)
@Component
public class ShippingPreparationHandler implements OrderHandler {
private OrderHandler next;
@Override
public void setNext(OrderHandler next) {
this.next = next;
}
@Override
public void handle(OrderEntity order) {
// 模擬發(fā)貨準(zhǔn)備邏輯
System.out.println("開始準(zhǔn)備發(fā)貨");
// 這里可以添加更多的發(fā)貨準(zhǔn)備邏輯
}
}
使用Spring的依賴注入功能自動裝配處理器鏈。
@Configuration
public class OrderChainConfig {
//Spring的ioc容器,支持通過Map或者List來直接注入對象,可以省去自己排序。
@Autowired
private List<OrderHandler> handlers;
@Bean
public OrderHandler orderHandler() {
OrderHandler last = null;
for (int i = handlers.size() - 1; i >= 0; i--) {
OrderHandler handler = handlers.get(i);
if (last != null) {
handler.setNext(last);
}
last = handler;
}
return last;
}
}
測試與運行。
@Autowired
private OrderHandler orderHandler;
@Test
@DisplayName("責(zé)任鏈")
public void orderChain(){
OrderEntity orderEntity = new OrderEntity();
orderEntity.setPaymentValid(true);
orderEntity.setInventoryAvailable(true);
orderHandler.handle(orderEntity);
}