责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。
网上有很多朋友已经对该模式介绍的非常详细了,也有案例帮助理解,可参考
Java设计模式之职责链模式
一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式
但是这两篇文章的案例中,对象与对象之间是有先后顺序的,即请求需要先发给组长,再发给经理,不能调换顺序,但是生活中和我们实际开发过程中,对象与对象之间也可以是平行关系,就像产品在流水线上做检查一样,先检查哪一部分都可以,任何一部分有问题,即可返回,不再往后检查。
本篇文章就是在上面两篇文章上做了改进,改成对象与对象之间是相互独立的并列关系。相比于第一篇文章,增加了处理器对象可动态配置功能。相比于第二篇文章,例子通俗易懂,请求简单化(有些场景不需要对请求进一步封装)。
该场景描述的是一个待检产品在流水线上检查,产品有两个属性,长度和宽度,流水线上的处理节点也有两个,即长度检查节点和宽度检查节点。为帮助理解,该场景设置的较为简单,实际开发工作中,待检查对象(请求)可以为上下文对象,附带较多属性,同时检查处理节点也可有多个,它们之间是相互独立的。
产品定义
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 待检验产品
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Product {
/**
* 产品长度
*/
Integer length;
/**
* 产品宽度
*/
Integer width;
}
处理器执行链定义,责任链的核心在于此
import java.util.ArrayList;
import java.util.List;
public class ProcessorChain{
// 保存处理节点
private List processorList = new ArrayList<>();
// 处理节点下标
private int index = 0;
// 动态扩展处理节点
public ProcessorChain addProcessor(Processor processor) {
processorList.add(processor);
return this;
}
// 获取处理器处理
public boolean process(Product product, ProcessorChain chain) {
if(index == processorList.size()) {
return true;
}
Processor processor = processorList.get(index);
index++;
return processor.process(product, chain);
}
}
处理器接口定义
public interface Processor {
boolean process(Product request, ProcessorChain chain);
}
长度检查处理器和宽度检查处理器
public class LengthCheckProcessor implements Processor{
@Override
public boolean process(Product request, ProcessorChain chain) {
Integer length = request.getLength();
if (length < 100 && length > 50) {
System.out.println("产品长度检验通过");
return chain.process(request, chain);
}
// 产品长度未检验通过
System.out.println("产品长度未检验通过");
return false;
}
}
public class WidthCheckProcessor implements Processor{
@Override
public boolean process(Product request, ProcessorChain chain) {
Integer width = request.getWidth();
if (width < 100 && width > 50) {
System.out.println("产品宽度检验通过");
return chain.process(request, chain);
}
// 产品宽度未检验通过
System.out.println("产品宽度未检验通过");
return false;
}
}
客户端
public class Main {
public static void main(String[] args) {
int[][] arrays = {{60, 60}, {40, 40}, {40, 60}, {60, 40}};
for (int[] array : arrays) {
ProcessorChain processorChain = new ProcessorChain();
processorChain.addProcessor(new LengthCheckProcessor());
processorChain.addProcessor(new WidthCheckProcessor());
Product product = new Product(array[0], array[1]);
boolean checkResult = processorChain.process(product, processorChain);
if(checkResult) {
System.out.println("产品最终检验合格");
} else {
System.out.println("产品最终检验不合格");
}
System.out.println();
}
}
}
结果:
产品长度检验通过
产品宽度检验通过
产品最终检验合格
产品长度未检验通过
产品最终检验不合格
产品长度未检验通过
产品最终检验不合格
产品长度检验通过
产品宽度未检验通过
产品最终检验不合格
1. 每个处理器可以通过注解扫描的方式添加进执行链中,不必在客户端中人为添加,只需自己定义处理器,实现处理器接口,添加该处理器的执行逻辑。
2. 待处理的请求对象可以是上下文对象,上下文对象中封装待检查条件,并将检查结果写入到上下文对象中。
如有问题,欢迎指正。也可加QQ 2422035338沟通交流。
1. https://segmentfault.com/a/1190000014940291
2. 一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式