概述
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你创建一系列对象,每个对象都可以处理请求,或者将请求传递给链中的下一个对象。在责任链模式中,请求沿着链传递,直到有一个对象处理它为止。
结构
责任链模式包含以下几个关键角色:
-
Handler(处理者):定义一个处理请求的接口。通常接口中包含一个处理请求的方法
handleRequest
。 -
ConcreteHandler(具体处理者):实现处理者接口的具体处理类。具体处理者可以处理请求,或者将请求传递给链中的下一个处理者。
-
Client(客户端):创建并向责任链对象提交请求。
示例代码
假设我们有一个简单的问题处理系统,问题可以按照紧急程度分为三个等级:低、中、高。每个问题会被提交给一个责任链,根据问题的紧急程度由不同的处理者来处理。
首先,定义处理请求的接口 Handler
:
// Handler.java
public interface Handler {
void handleRequest(int level);
}
然后,实现具体的处理者 ConcreteHandler
:
// ConcreteHandler.java
public class ConcreteHandler implements Handler {
private int level;
private Handler nextHandler;
public ConcreteHandler(int level) {
this.level = level;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(int level) {
if (this.level <= level) {
System.out.println("Problem is handled by handler with level: " + this.level);
} else if (nextHandler != null) {
nextHandler.handleRequest(level);
} else {
System.out.println("No handler is available to handle this problem.");
}
}
}
最后,在客户端代码中创建责任链并提交请求:
// Client.java
public class Client {
public static void main(String[] args) {
Handler lowHandler = new ConcreteHandler(1);
Handler mediumHandler = new ConcreteHandler(2);
Handler highHandler = new ConcreteHandler(3);
lowHandler.setNextHandler(mediumHandler);
mediumHandler.setNextHandler(highHandler);
// Simulation of problem submissions
lowHandler.handleRequest(2);
lowHandler.handleRequest(4);
lowHandler.handleRequest(1);
}
}
使用场景
责任链模式通常适用于以下场景:
- 当程序需要动态指定可以处理请求的对象集合时,责任链可以灵活地添加、删除或者调整处理者顺序。
- 当程序需要根据请求的类型和数据动态地选择处理方式时。
- 当不明确请求的接收者时,可以让系统自动决定合适的接收者。
总结
责任链模式通过将多个处理者对象连接成一条链,并沿着这条链传递请求,直到有一个处理者处理该请求或者所有处理者都无法处理该请求为止。这种模式可以有效地将请求的发送者和接收者解耦,提高系统的灵活性和可扩展性。