责任链模式是一种行为设计模式,允许多个对象对一个请求进行处理,从而解耦请求的发送者和接收者。这个模式中,通常每个处理者都包含对另一个处理者的引用。如果一个处理者不能处理请求,它将该请求传递给下一个处理者,以此类推。
责任链模式的主要角色:
- Handler(抽象处理者):定义了一个处理请求的接口。如果需要,它可以定义一个链接到下一个处理者的方法。
- ConcreteHandler(具体处理者):处理它负责的请求,可以访问它的后继者,如果可以处理请求就处理,否则将该请求传递给它的后继者。
- Client(客户类):向链上的具体处理者对象提交请求,让链去处理。
Java 实现示例:
// 抽象处理者
abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
// 具体处理者A
class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("HandlerA处理请求" + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理者B
class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("HandlerB处理请求" + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
handlerA.setSuccessor(handlerB);
for (int i = 0; i < 30; i+=5) {
handlerA.handleRequest(i);
}
}
}
在上述示例中,客户端创建了两个具体处理者(ConcreteHandlerA
和 ConcreteHandlerB
)。ConcreteHandlerA
可以处理0到10之间的请求,而 ConcreteHandlerB
可以处理10到20之间的请求。在客户端代码中,我们为每个请求分配了处理者,并观察到每个处理者如何处理或传递请求。
责任链模式在Java的许多框架和库中都有应用,例如Servlet的Filter链。