一、什么是责任链模式
责任链模式(Chain of Responsibility Pattern),顾名思义,为请求者和接受者之间创建一条对象处理链路,避免请求发送者与接收者耦合在一起!
责任链模式,是一种实用性非常强的设计模式,比较典型的应用场景有:
1、Apache Tomcat 对 Encoding 编码处理的处理
2、SpringBoot ⾥⾯的拦截器、过滤器链
3、Netty 中的处理链
4、支付风控的机制
5、⽇志处理级别
尤其是当程序的处理流程很长的时候,采用责任链设计模式,不仅实现优雅,而且易复用可扩展!
二、代码实践
在 SpringBoot 中,责任链模式的实践方式有好几种,今天我们主要抽三种实践方式给大家介绍。
我们以某下单流程为例,将其切成多个独立检查逻辑,可能会经过的数据验证处理流程如下:
2.1 方式一
首先,我们定义一个简易版的下单对象OrderAddContext
import lombok.Data;
@Data
public class OrderAddContext {
// 请求唯一序列ID
private String seqId;
// 用户ID
private String userId;
// 产品skuId
private Long skuId;
// 下单数量
private Integer amount;
// 用户收货地址ID
private String userAddressId;
}
然后,我们定义一个数据处理接口OrderHandleIntercept,用于标准化执行!
import com.bc.work.dto.OrderAddContext;
public interface OrderHandleIntercept {
/**
* 指定执行顺序
*/
int sort();
/**
* 对参数进行处理
*/
OrderAddContext handle(OrderAddContext context);
}
接着我们分别创建三个不同的接口实现类,并指定执行顺序,内容如下:
RepeatOrderHandleInterceptService:用于重复下单的逻辑验证
ValidOrderHandleInterceptService:用于验证请求参数是否合法
BankOrderHandleInterceptService:用于检查客户账户余额是否充足
import com.bc.work.dto.OrderAddContext;
import com.bc.work.service.OrderHandleIntercept;
import org.springframework.stereotype.Component;
@Component
public class RepeatOrderHandleInterceptService implements OrderHandleIntercept {
@Override
public int sort() {
//用于重复下单的逻辑验证,在执行顺序为1
return 1;
}
@Override
public OrderAddContext handle(OrderAddContext context) {
System.out.println("通过seqId,检查客户是否重复下单");
return context;
}
}
import com.bc.work.dto.OrderAddContext;
import com.bc.work.service.OrderHandleIntercept;
import org.springframework.stereotype.Component;
@Component
public class ValidOrderHandleInterceptService implements OrderHandleIntercept {
@Override
public int sort() {
//用于验证请求参数是否合法,执行顺序为2
return 2;
}
@Override
public OrderAddContext handle(OrderAddContext context) {