前言
责任链模式的基本思想:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
我的理解:
子类继承一个统一的抽象父类,这个抽象父类本身拥有当前的抽象父类的对象的引用,当子类中的该抽象父类的属性的具体引用变化后,此时具体的实现方法就变成了子类重写的方法。
本文是作者结合工作中实际的责任链的处理情况,构建了如下的代码场景:
1. 责任链的实现链条是固定执行的,模拟数据必须走完所有的数据过滤的处理器(注意:责任链的实现链条是不一定固定的,这里是固定的情况)
2. 具体的子类的实现必须是可配置的,即可以通过@AutoWire的形式自由配置子类,假如没有配置子类,则使用基类去执行过滤
代码实现
该场景描述的是一个代检产品在流水线上检查,产品有两个属性,长度和宽度,流水线上的处理节点也有两个,即长度检验器和宽度检验器。并且所有的检验器都继承于基类BaseCheckProcesor
public interface Processor {
boolean doProcess(Product request);
}
/**
* @author: 代码丰
* @Date: 2022/8/14 16:06
* @Description: 默认处理器的实现类
*/
public class BaseCheckProcessor implements Processor {
@Override
public boolean doProcess(Product request) {
return true;
}
}
/**
* 长度检验器的实现类
*/
@Component
public class LengthCheckProcessor extends BaseCheckProcessor {
@Override
public boolean doProcess(Product request) {
Integer length = request.getLength();
if (length < 100 && length > 50) {
System.out.println("产品长度检验通过");
return true;
}
// 产品长度未检验通过
System.out.println("产品长度未检验通过");
return false;
}
}
/**
* 宽度检验器的实现类
*/
@Component
public class WidthCheckProcessor extends BaseCheckProcessor {
@Override
public boolean doProcess(Product request) {
Integer width = request.getWidth();
if (width < 100 && width > 50) {
System.out.println("产品宽度检验通过");
return true;
}
// 产品宽度未检验通过
System.out.println("产品宽度未检验通过");
return false;
}
}
接下来就是处理器链了,可见处理器链中,以list形式包含所有的处理节点 ,并且doProcess方法是顺序执行的,模拟某一业务场景需要通过所有的处理器
//处理器链
public class ProcessorChain {
// 保存处理节点
private List<Processor> processorList = new ArrayList<>();
//模拟springBoot动态注入不同的处理器
private List<Processor> getProcessList() {
List<Processor> processorList = new ArrayList<>();
processorList.add(new LengthCheckProcessor());
processorList.add(new WidthCheckProcessor());
return processorList;
}
//处理器的顺序调用,先校验长度,再校验宽度,同时返回Result类的结果
public Result doProcess(Product product) {
List<Processor> list = getProcessList();
Result result = new Result(true);
for (Processor item : list) {
if (!item.doProcess(product)) {
result.flag = false;
}
}
return result;
}
}
/**
* @author: 代码丰
* @Date: 2022/8/3 14:42
* @Description: 返回的类
*/
@Data
@AllArgsConstructor
public class Result {
Boolean flag;
}
最后就是模拟数据的调用
public class Main {
public static void main(String[] args) {
int[][] arrays = {
{60, 60}, {60, 40},{110,110}};
for (int[] array : arrays) {
ProcessorChain processorChain = new ProcessorChain();
Product product = new Product(array[0], array[1]);
Result checkResult = processorChain.doProcess(product);
if(checkResult.flag) {
System.out.println("产品最终检验合格");
} else {
System.out.println("产品最终检验不合格");
}
System.out.println();
}
}
}
总结
责任链模式的核心思想
1. 通过不同的处理器的子类实现,去使得数据经过了这些处理器,最终数据得到了筛选。
2. 子类继承一个统一的抽象父类,这个抽象父类本身拥有当前的抽象父类的对象的引用,当子类中的该抽象父类的属性的具体引用变化后,此时具体的实现方法就变成了子类重写的方法。