设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许多个对象处理同一请求,形成一条链。请求沿着链传递,直到有对象处理它或链结束。该模式解耦了请求发送者和接收者,增强了灵活性。
·
责任链模式概述
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许多个对象处理同一请求,形成一条链。请求沿着链传递,直到有对象处理它或链结束。该模式解耦了请求发送者和接收者,增强了灵活性。
适用场景
- 多个对象可以处理同一请求,但具体处理者在运行时确定。
- 需要动态指定请求处理者或处理顺序。
- 请求可能被多个对象处理,但只需一个对象实际处理。
模式结构
- Handler(抽象处理者):定义处理请求的接口,通常包含处理方法和设置后继者的方法。
- ConcreteHandler(具体处理者):实现抽象处理者的接口,处理自己负责的请求,否则将请求转发给后继者。
- Client(客户端):创建处理链,并向链头的处理者提交请求。
实现步骤
1. 定义抽象处理者接口
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
2. 实现具体处理者
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeA")) {
System.out.println("ConcreteHandlerA处理请求");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals("TypeB")) {
System.out.println("ConcreteHandlerB处理请求");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
3. 定义请求类
public class Request {
private String type;
public Request(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
4. 客户端使用
public class Client {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setSuccessor(handlerB);
Request request1 = new Request("TypeA");
Request request2 = new Request("TypeB");
handlerA.handleRequest(request1);
handlerA.handleRequest(request2);
}
}
优缺点分析
优点
- 降低耦合度:请求发送者无需知道具体处理者。
- 增强灵活性:可动态调整链中处理者或顺序。
- 符合开闭原则:新增处理者无需修改现有代码。
缺点
- 请求可能未被处理:需确保链的完整性。
- 性能问题:长链可能导致请求传递耗时。
实际应用案例
- Java Servlet中的Filter机制:多个Filter形成责任链处理HTTP请求。
- 日志框架(如Log4j):不同级别的日志处理器形成链。
- 审批流程:多级审批场景中,每一级审批人作为链中的一个节点。
注意事项
- 避免循环引用:确保责任链无环。
- 控制链的长度:过长链可能影响性能。
- 明确终止条件:防止请求未被处理导致内存泄漏。
通过责任链模式,可以灵活组织处理逻辑,适应复杂多变的业务场景。
更多推荐


所有评论(0)