1、模式介绍:
职责链模式是一种行为设计模式,其中多个对象按顺序处理请求,直到其中一个对象能够处理请求为止。请求沿着链传递,直到有一个对象处理它为止。
2、应用场景:
职责链模式适用于以下场景:
请求的发送者不需要知道请求的处理细节,以及请求的处理者是谁。
多个对象可以处理同一个请求,但具体处理者在运行时确定。
系统需要动态地指定可以处理请求的对象集合。
具体的应用场景包括:
权限验证:例如,一个网页访问请求可以经过多个权限验证器,任何一个验证器通过即可访问。
日志记录:日志记录器可以形成一个职责链,每个记录器记录不同级别的日志。
请求的分发:例如,一个请求可以经过多个过滤器或处理器,每个处理器负责不同的处理逻辑。
3、优点:
降低耦合度:请求的发送者和接收者解耦,可以灵活地添加或删除处理器。
增强了灵活性:可以动态地改变链的组成和处理顺序。
简化了对象:每个处理器只关注自己的任务,不需要了解整个处理流程。
4、缺点:
请求可能未被处理:如果链未正确配置,请求可能无法被处理。
性能问题:长链可能会影响性能,因为每个请求都可能沿着链传递到链的末端。
5、代码示例:
/**
* 请求类
*
* @author FM_南风
* @date 2024/7/5
*/
public class Request {
private int level;
public Request(int level) {
this.level = level;
}
public int getLevel() {
return level;
}
}
/**
* 抽象处理器类
*
* @author FM_南风
* @date 2024/7/5
*/
abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
/**
* 具体处理器类 - 级别1处理器
*
* @author FM_南风
* @date 2024/7/5
*/
public class ConcreteHandler1 extends Handler{
public void handleRequest(Request request) {
if (request.getLevel() <= 1) {
System.out.println("ConcreteHandler1 处理请求");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
/**
* 具体处理器类 - 级别2处理器
*
* @author FM_南风
* @date 2024/7/5
*/
public class ConcreteHandler2 extends Handler {
public void handleRequest(Request request) {
if (request.getLevel() <= 2) {
System.out.println("ConcreteHandler2 处理请求");
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
/**
* 具体处理器类 - 级别3处理器
*
* @author FM_南风
* @date 2024/7/5
*/
public class ConcreteHandler3 extends Handler{
public void handleRequest(Request request) {
if (request.getLevel() <= 3) {
System.out.println("ConcreteHandler3 处理请求");
} else {
System.out.println("所有处理器均不能处理该请求");
}
}
}
/**
* 应用
*
* @author FM_南风
* @date 2024/7/5
*/
public class ChainClient {
public static void main(String[] args) {
// 创建处理器对象
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
// 设置处理链
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
// 创建不同级别的请求
Request request1 = new Request(2);
Request request2 = new Request(5);
// 处理请求
handler1.handleRequest(request1); // 输出 ConcreteHandler2 处理请求
handler1.handleRequest(request2); // 输出 所有处理器均不能处理该请求
}
}
6、结果展示:
7、示例说明:
在这个例子中:
Request
类表示请求,具有一个级别属性。Handler
是抽象处理器类,定义了处理请求的方法和持有下一个处理器的引用。ConcreteHandler1
、ConcreteHandler2
和 ConcreteHandler3
是具体的处理器类,每个处理器根据自己的能力处理请求或传递到下一个处理器。ChainOfResponsibilityPatternExample
是测试类,创建了一个简单的处理链,并测试不同级别的请求。