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的依赖注入简化责任链构建
相关推荐
喜欢流萤吖~5 小时前
微服务架构解析:从单体到分布式
spring boot·后端
小江的记录本5 小时前
【分布式】分布式核心组件——分布式锁:Redis/ZooKeeper/etcd 实现方案(附全方位对比表)、优缺点、Redlock、时钟回拨问题
java·网络·redis·分布式·后端·zookeeper·架构
小江的记录本5 小时前
【分布式】分布式核心组件——分布式ID生成:雪花算法、号段模式、美团Leaf、百度UidGenerator、时钟回拨解决方案
分布式·后端·算法·缓存·性能优化·架构·系统架构
GetcharZp11 小时前
拒绝低效!这款神器,让你的终端效率起飞 | 深度解析 fzf 终极指南
后端
自珍JAVA12 小时前
高效处理Long列表与集合运算:基于RoaringBitmap的工具类解析与应用场景
后端
小码哥_常12 小时前
Spring Boot项目上线秘籍:日志、监控、异常处理全攻略
后端
GreenTea13 小时前
AI 时代,工程师的不可替代性在哪里
前端·人工智能·后端
朦胧之13 小时前
AI 编程开发思维
前端·后端·ai编程
独自归家的兔15 小时前
OCPP 1.6 协议详解:StatusNotification 状态通知指令
开发语言·数据库·spring boot·物联网
希望永不加班15 小时前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式