SpringBoot实现责任链模式

文章介绍了如何运用责任链模式来实现订单支付的处理,包括鉴权、参数检查和余额验证等步骤。通过定义支付订单表单类、支付接口以及一系列的处理节点,如鉴权、参数和余额过滤器,构建了一个动态的处理链。在SpringBoot环境下,利用注解对处理顺序进行控制,当请求不符合条件时,处理链会提前终止。
摘要由CSDN通过智能技术生成


前言

类似现实生活中铁链,由一个个铁环首尾相接构成一条链,如果这种结构用在编程领域,则每个节点可以看做一个对象,每个对象有不同的处理逻辑,将一个请求从链的首端发出,沿着链的路径依次传递每个节点对象,直到有对象处理这个请求为止。

一、责任链模式简介

责任链模式(Chain of Responsibility Pattern),顾名思义,为请求者和接受者之间创建一条对象处理链路,避免请求发送者与接收者耦合在一起。

二、代码实现

场景:订单支付过程,进行鉴权检验、参数检验、余额检验等等

1.定义一个支付订单表单类

@Data
public class PayOrderForm {

    // token
    private String token;
    // 订单ID
    private String orderId;
    // 金额
    private BigDecimal amount;

}

2.定义一个支付接口

public interface PayOrderService {

    boolean payOrder(PayOrderForm payOrderForm);

}

3.定义责任链节点处理类

通过@Order注解对每个节点的执行优先进行排序

3.1鉴权处理

@Order(0)
@Component
public class AuthPayOrderChainFilter implements PayOrderService {

    @Override
    public boolean payOrder(PayOrderForm payOrderForm) {
        if (!"token".equals(payOrderForm.getToken())) {
            System.out.println("token不合法");
            return false;
        }
        return true;
    }

}

3.2参数处理

@Order(1)
@Component
public class ParamsPayOrderChainFilter implements PayOrderService {

    @Override
    public boolean payOrder(PayOrderForm payOrderForm) {
        if (StrUtil.isBlank(payOrderForm.getOrderId())) {
            System.out.println("订单ID不能为空");
            return false;
        }
        if (ObjectUtil.isNull(payOrderForm.getAmount())) {
            System.out.println("金额不能为空");
            return false;
        }
        return true;
    }

}

3.3余额处理

@Order(2)
@Component
public class BalancePayOrderChainFilter implements PayOrderService {

    @Override
    public boolean payOrder(PayOrderForm payOrderForm) {
        // 查询余额
        System.out.println("余额检验通过");
        return true;
    }

}

4.定义责任链处理类

通过@Autowired注解注入PayOrderService列表,SpringBoot会自动将实现改接口的类加入列表

@Component
public class PayOrderChainProcessor {

    @Autowired
    private List<PayOrderService> payOrderServices;

    public void handlePayOrder(PayOrderForm payOrderForm) {
        for (PayOrderService payOrderService : payOrderServices) {
            boolean payOrder = payOrderService.payOrder(payOrderForm);
            if (!payOrder) break;
        }
    }

}

5.测试

@Autowired
private PayOrderChainProcessor payOrderChainProcessor;
@Test
public void test() {
	PayOrderForm payOrderForm = new PayOrderForm();
    payOrderChainProcessor.handlePayOrder(payOrderForm);

    System.out.println("=========添加token===========");

    // 添加token
    payOrderForm.setToken("token");
    payOrderChainProcessor.handlePayOrder(payOrderForm);

    System.out.println("==========添加订单ID与金额==========");

    // 添加订单ID与金额
    payOrderForm.setOrderId("order1");
    payOrderForm.setAmount(new BigDecimal(100));
    payOrderChainProcessor.handlePayOrder(payOrderForm);
}

输出:
在这里插入图片描述


总结

多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向对个对象中的一个提交一个请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值