springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。

当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。

属于行为型模式。

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的依赖注入简化责任链构建
相关推荐
向前看-4 小时前
验证码机制
前端·后端
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
Funny-Boy6 小时前
Chain Responsibility Pattern
责任链模式
AskHarries7 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion8 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil78 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp8 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder9 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚10 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes