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的依赖注入简化责任链构建
相关推荐
程序员码歌3 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
橙*^O^*安3 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
工程师小星星3 小时前
Golang语言的文件组织方式
开发语言·后端·golang
哈喽姥爷4 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
小蒜学长4 小时前
基于springboot 校园餐厅预约点餐微信小程序的设计与实现(代码+数据库+LW)
数据库·spring boot·微信小程序
舒一笑5 小时前
为什么where=Version就是乐观锁了?
后端·mysql·程序员
GoGeekBaird5 小时前
关于垂类AI应用落地行业的方法论思考
后端·github·agent
小宁爱Python6 小时前
Django 基础入门:命令、结构与核心配置全解析
后端·python·django
老华带你飞6 小时前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·vue.js·spring boot·考研·小程序·毕设·考研论坛平台小程序
你的人类朋友6 小时前
认识一下Bcrypt哈希算法
后端·安全·程序员