责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。
当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。
属于行为型模式。
1、定义处理器接口
java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {
private Integer creditScore;
private Integer quantity;
}
java
public interface OrderHandler {
boolean handle(Order order);
}
2、实现不同的校验处理器
信用校验处理器:
java
@Component
public class CreditHandler implements OrderHandler{
@Override
public boolean handle(Order order) {
if (order.getCreditScore() % 2 != 0){
System.out.println("信用不足");
return false;
}
return true;
}
}
库存校验处理器:
java
@Component
public class StockHandler implements OrderHandler{
@Override
public boolean handle(Order order) {
if (order.getQuantity() > 20){
System.out.println("库存不足");
return false;
}
return true;
}
}
3、责任链管理器
java
@Component
public class OrderHandlerChain {
private final List<OrderHandler> handlers;
public OrderHandlerChain(List<OrderHandler> handlers){
this.handlers = handlers;
}
public boolean process(Order order){
for (OrderHandler handler : handlers) {
if (!handler.handle(order)){
return false;
}
}
return true;
}
}
4、服务类调用责任链
java
@Component
public class OrderService {
private final OrderHandlerChain handlerChain;
private OrderService(OrderHandlerChain handlerChain){
this.handlerChain = handlerChain;
}
public boolean processOrder(Order order){
boolean process = handlerChain.process(order);
if (process){
System.out.println("校验成功");
}
return process;
}
}
5、测试
java
@SpringBootTest
public class OrderServiceTest {
@Autowired
private OrderService orderService;
@Test
public void testOrderProcess(){
Order order = new Order(2, 5);
orderService.processOrder(order);
Order order1 = new Order(2, 5);
orderService.processOrder(order1);
Order order2 = new Order(2, 21);
orderService.processOrder(order2);
}
}
6、优点
- 解耦逻辑:每个校验逻辑独立实现,符合单一职责原则
- 灵活扩展:新增校验只需添加新的Handler实现类,无需修改现有代码
- 支持动态调整:可通过调整List的顺序来改变校验顺序
- 利用Spring自动装配:使用Spring的依赖注入简化责任链构建