一、什么是责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。责任链模式将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。
二、责任链模式主要是解决了什么问题?
- 请求发送者与处理者解耦:发送者不需要知道哪个对象处理请求,只有当请求传递到合适的对象时,它才会被处理。
- 动态改变请求处理的顺序:可以在运行时动态调整链条中的处理对象或处理顺序。
- 处理多个请求:多个对象都可以处理请求,处理链的顺序可以灵活控制。
三、责任链模式的实现
责任链模式的实现通常包含以下几个角色:
抽象处理者(Handler):
- 定义一个接口或者抽象类,声明一个处理请求的方法,并且持有对下一个处理者的引用。
- 具体的请求处理逻辑通常由子类来实现。
具体处理者(ConcreteHandler):
- 每个具体的处理者类继承抽象处理者,并实现请求的具体处理方法。
- 如果该处理者能够处理请求,它就会处理;如果不能,它将请求转发给下一个处理者。
客户端(Client):
- 创建和设置责任链。客户端可直接向链条中的第一个处理者发起请求,不需要关心请求的具体处理者是谁。
请求(Request):
- 请求是传递给责任链的对象。每个处理者根据需要来决定是否处理该请求,或者将请求传递到链条中的下一个处理者。
// 抽象处理者
abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(Request request);
}
// 具体处理者A
class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeA")) {
System.out.println("ConcreteHandlerA 处理请求。");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 具体处理者B
class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeB")) {
System.out.println("ConcreteHandlerB 处理请求。");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
// 请求类
class Request {
private String type;
public Request(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
// 客户端代码
public class ChainPatternDemo {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setNextHandler(handlerB);
Request request1 = new Request("TypeA");
Request request2 = new Request("TypeB");
handlerA.handleRequest(request1);
handlerA.handleRequest(request2);
}
}
四、责任链模式的优点
- 解耦请求发送者与处理者:发送请求的客户端不需要知道哪个具体对象会处理请求,降低了对象之间的耦合。
- 增加新的处理类方便:可以根据需求,灵活添加新的处理节点,不需要修改原有代码,符合开闭原则。
- 动态控制责任链:可以在运行时动态地改变责任链的顺序和处理者的个数。
五、责任链模式的缺点
- 可能会导致请求处理效率低下:如果链条过长,请求可能会传递很久,导致响应时间较长。
- 无法保证请求一定会被处理:如果责任链中的所有处理者都无法处理请求,最终请求会被丢弃,可能导致请求失败。
- 过多的处理者增加复杂度:如果责任链中的处理者太多,可能会增加代码的复杂度,难以维护。
六、责任链模式的应用场景
- 多级审批系统:如公司内部的请假审批流程,不同级别的领导可以处理不同级别的请假请求。
- 事件处理系统:如GUI中的事件处理,事件可以沿着组件层次结构传递,直到有组件处理它。
- 过滤器链:如Web应用中的过滤器链,请求可以通过多个过滤器进行处理。
七、责任链模式面试高频问题
- 责任链模式的核心思想是什么?
- 如何避免责任链模式中的请求未被处理的情况?
回复