责任链模式属于行为型设计模式,核心思想是将请求的发送者与接收者进行解耦,构建一条由多个处理对象组成的链式结构。每个处理者决定是否能够处理该对象,否则将其传递给下一个节点进行处理。发送者不知道并不知道由谁来处理
使用场景
- 当有多个对象可以处理请求,有对象自行决定是否处理
- 工作流引擎:请假流程、报销流程等
- 过滤器模式:对请求或者数据进行过滤
- 权限设计:对用户角色的验证
核心组件
- 抽象处理者:Handler
- 定义了处理请求的接口,并维护下一个处理对象的引用
setNext()
:下一节点handleRequest()
:处理请求
public interface Handler{void setNext(Handler next);void handleRequest(Object obj);
}
- 具体处理者:Concrete Handler
- 实现抽象接口,定义具体的处理逻辑
- 当前对象无法处理则交由下一级进行处理
public class ConcreteHandler implements Handler{private Handler next@Overridepublic void setNext(Handler next){this.next= next;}@Overridepublic void handleRequest(Object obj) {if (validate(obj)) {System.out.println("参数校验通过");if (next != null) next.handleRequest(obj);} else {System.out.println("参数不合法,终止流程");}}private boolean validate(Object obj) {//具体校验逻辑}
}
- 客户端:Client
- 负责将所有的处理对象组装成处理链,客户端无需知晓链的具体结构,只要将请求发送给责任链的第一个处理者即可。
类图
Handler
:抽象类FirstHandler
:实现类HandlerClient
:客户端类
//抽象类
public interface Handler { //下一个处理节点 void setNext(Handler next); void handleRequest(Object obj);
}//实现类
public class FirstHandler implements Handler{ private Handler next; @Override public void setNext(Handler next) { this.next = next; } @Override public void handleRequest(Object obj) { if (validate(obj)) { System.out.println("参数校验通过"); if (next != null) next.handleRequest(obj); } else { System.out.println("参数不合法,终止流程"); } } private boolean validate(Object obj) { return Objects.nonNull(obj); }
}//客户端类public class HandlerClient { public static void main(String[] args) { Handler first = new FirstHandler(); Handler second = new SecondHandler(); Handler third = new ThirdHandler(); first.setNext(second); second.setNext(third); Object object = new Object(); first.handleRequest(object); } }
模式的优缺点
优点
- 解耦请求发送者和接受者
- 能够动态调整链结构,运行过程中添加或者移除节点
- 支持多层级处理,例如对请求编码、鉴权、限流
缺点
- 请求可能不满足所有节点,需要单独处理
- 链结构过长影响性能
总结
使用责任链模型将复杂的处理逻辑拆分为独立的单元,可以动态的进行增删,提高了系统的灵活性和可维护性。