1、责任链模式定义
链是什么?
链是一系列节点的集合,各个节点可以灵活的拆分重组
责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条线,并沿着这条链传递该请求,知道有一个对象处理它为止
2、责任链模式结构
Handler:抽象处理者角色:定义一个处理请求的接口,接口可以定义一个方法来设置和返回后续处理者的引用
java">import lombok.Data;
/**
* 抽象处理者
*/
@Data
public abstract class Handler {
/**
* 后续的处理对象
*/
protected Handler successor;
/**
* 处理请求的方法,可以按照具体要求来选择是否传递参数
*/
public abstract void handlerRequest();
}
ConcreteHandler:具体处理者角色:具体处理者收到请求可选择处理请求或者将请求传递给下一个处理者
java">/**
* 具体处理者 A
* 传入参数小于等于 10 进行处理,否则由下一个处理者处理
*/
public class ConcreteHandlerA extends Handler {
@Override
public void handlerRequest(Integer num) {
if (num <= 10) {
System.out.println("ConcreteHandlerA 对请求进行处理");
} else {
successor.handlerRequest(num);
}
}
}
/**
* 具体处理者 B
* 传入参数大于 20 进行处理,否则由下一个处理者处理
*/
public class ConcreteHandlerB extends Handler {
@Override
public void handlerRequest(int num) {
if (num > 10 && num <= 15) {
System.out.println("ConcreteHandlerB 对请求进行处理");
} else {
successor.handlerRequest(num);
}
}
}
/**
* 默认处理者
*/
public class DefaultHandler extends Handler {
@Override
public void handlerRequest(int num) {
System.out.println("DefaultHandler 对请求进行处理");
}
}
调用方代码
java">public class HandlerClient {
public static void main(String[] args) {
// 组装责任链
ConcreteHandlerA concreteHandlerA = new ConcreteHandlerA();
ConcreteHandlerB concreteHandlerB = new ConcreteHandlerB();
DefaultHandler defaultHandler = new DefaultHandler();
concreteHandlerA.setSuccessor(concreteHandlerB);
concreteHandlerB.setSuccessor(defaultHandler);
int[] requests = {-1, 0, 1, 11, 15, 19};
for (int request : requests) {
concreteHandlerA.handlerRequest(request);
}
// ConcreteHandlerA 对请求进行处理,num = -1
// ConcreteHandlerA 对请求进行处理,num = 0
// creteHandlerA 对请求进行处理,num = 1
// creteHandlerB 对请求进行处理,num = 11
// creteHandlerB 对请求进行处理,num = 15
// aultHandler 对请求进行处理,num = 19
}
}
3、责任链模式特点
- 当用户提交请求时,请求沿链传递知道有一个 ConcreteHandler 对请求进行处理
- 接收者和发送者都没有对方的明确信息,链中的对象也不知道链的组成结构,简化了对象的互相连接,仅需要保持一个指向后续处理者的引用即可
- 责任链模式需要进行正确的配置,否则可能会出现一个请求到了链的末端都没有被处理,需要存在一个默认的兜底逻辑