责任链模式的另一种实现方式(动态注入 + 顺序执行)

前言

责任链模式的基本思想:

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

我的理解:

子类继承一个统一的抽象父类,这个抽象父类本身拥有当前的抽象父类的对象的引用,当子类中的该抽象父类的属性的具体引用变化后,此时具体的实现方法就变成了子类重写的方法。

本文是作者结合工作中实际的责任链的处理情况,构建了如下的代码场景:

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方法是顺序执行的,模拟某一业务场景需要通过所有的处理器

扫描二维码关注公众号,回复: 17075131 查看本文章
//处理器链
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. 子类继承一个统一的抽象父类,这个抽象父类本身拥有当前的抽象父类的对象的引用,当子类中的该抽象父类的属性的具体引用变化后,此时具体的实现方法就变成了子类重写的方法。

参考资料

Java设计模式之职责链模式 - SegmentFault 思否

(38条消息) Java设计模式之责任链模式(简单易懂)_罗纳尔光的博客-CSDN博客_java 责任链模式

猜你喜欢

转载自blog.csdn.net/qq_44716086/article/details/126332615