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
是测试类,创建了一个简单的处理链,并测试不同级别的请求。