定义
将请求发送者和请求接收者解耦,让请求的接收者形成链式操作,所有人都能够接收到请求,直到有人处理。
结构图
![](https://i-blog.csdnimg.cn/blog_migrate/b8b3e3f0888291a0365c8c4904c8b201.png)
角色与理解
责任链模式包含如下角色
Handler(抽象处理者):所有具体处理者的父类,一般定义为抽象类,定义了一个统一的处理入口,以及维持了一个抽象处理者类型对象的引用,用于形成链式处理者
ConcreteHandler(具体处理者):继承抽象处理者,实现统一的处理入口,将自己无法处理的请求转发给下一个处理者
处理链的形成是在客户端完成的。以及处理链的顺序也是客户端决定的。
纯的责任链模式
处理者只有两种选择,,要么全部处理请求,要么全部不处理,不能只处理一部分
请求必须被处理,不存在请求最终未被处理的情况发生
不纯的责任链模式
可以处理部分,然后将请求转发给下一个处理者处理
请求可以不被所有处理者处理
核心代码
抽象处理者
public abstract class Handler {
protected Handler nextSuccessor;
public abstract void handleRequest(String request);
public void setNextSuccessor(Handler nextSuccessor) {
this.nextSuccessor = nextSuccessor;
}
}
具体处理者
@Slf4j
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(String request) {
if ("a".equals(request)) {
log.info("A处理了请求");
} else {
this.nextSuccessor.handleRequest(request);
}
}
}
@Slf4j
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(String request) {
if ("b".equals(request)) {
log.info("B处理了请求");
} else {
this.nextSuccessor.handleRequest(request);
}
}
}
@Slf4j
public class ConcreteHandlerC extends Handler {
@Override
public void handleRequest(String request) {
if ("c".equals(request)) {
log.info("C处理了请求");
} else {
this.nextSuccessor.handleRequest(request);
}
}
}
客户端
public class Client {
public static void main(String[] args) {
Handler a, b, c;
a = new ConcreteHandlerA();
b = new ConcreteHandlerB();
c = new ConcreteHandlerC();
a.setNextSuccessor(b);
b.setNextSuccessor(c);
a.handleRequest("b");
}
}
//输出结果
//INFO com.amelie.pattern.chainOfResponsibility.ConcreteHandlerB - B处理了请求