广东seo推广外包,宜昌优化网站建设,app制作教程步骤和方法,简单的手机网页制作定义 Chain of Responsibility Pattern#xff1a;使多个对象都有机会处理请求#xff0c;从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链#xff0c; 并沿着这条链传递该请求#xff0c;直到有对象处理它为止。
优势 解耦请求发送者与接收者#…定义 Chain of Responsibility Pattern使多个对象都有机会处理请求从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链 并沿着这条链传递该请求直到有对象处理它为止。
优势 解耦请求发送者与接收者发送者无需知道具体由哪个对象处理请求 新增处理者时只需加入链条无需修改原有代码符合 “开闭原则”。
场景
生活场景
最典型的例子是 公司请假审批流程 请假 1 天以内组长直接审批 请假 1-3 天组长无权处理传递给部门经理审批 请假 3 天以上部门经理无权处理传递给总经理审批。
这里组长→部门经理→总经理形成一条 “责任链”请假请求会沿着链条传递直到被对应的负责人处理。
Java 中的责任链场景 Servlet Filter 链 客户端请求经过多个 Filter过滤器处理如编码过滤、权限校验、日志记录等每个 Filter 可选择处理请求后传递给下一个 Filter或直接终止请求。 Spring Interceptor 链 Spring MVC 中的拦截器链对请求进行预处理如登录验证、后处理如数据封装每个 Interceptor 可决定是否继续传递请求。 异常处理机制 Java 的异常捕获try-catch本质上也是责任链异常会从发生处向上传递直到被第一个匹配的 catch 块处理。
代码
// 抽象审批者类定义责任链节点的通用行为
abstract class Approver {protected Approver nextApprover; // 下一个审批者责任链的下一个节点// 设置下一个审批者public void setNextApprover(Approver nextApprover) {this.nextApprover nextApprover;}// 抽象处理方法子类需实现具体审批逻辑public abstract void handleRequest(LeaveRequest request);
}// 请假请求类封装请求信息class LeaveRequest {private String name; // 申请人姓名private int days; // 请假天数public LeaveRequest(String name, int days) {this.name name;this.days days;}// getter方法public String getName() {return name;}public int getDays() {return days;}
}// 组长处理1天以内的请假class GroupLeader extends Approver {Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() 1) {System.out.println(组长批准 request.getName() 请假 request.getDays() 天);} else {// 超过权限传递给下一个审批者if (nextApprover ! null) {nextApprover.handleRequest(request);}}}
}// 总经理处理3天以上的请假
class GeneralManager extends Approver {Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() 3) {System.out.println(总经理批准 request.getName() 请假 request.getDays() 天);} else {// 超过权限传递给下一个审批者此处为链的终点可省略if (nextApprover ! null) {nextApprover.handleRequest(request);}}}
}// 部门经理处理1-3天的请假class DeptManager extends Approver {Overridepublic void handleRequest(LeaveRequest request) {if (request.getDays() 1 request.getDays() 3) {System.out.println(部门经理批准 request.getName() 请假 request.getDays() 天);} else {// 超过权限传递给下一个审批者if (nextApprover ! null) {nextApprover.handleRequest(request);}}}
}// 测试类构建责任链并模拟请假请求
class Client {public static void main(String[] args) {// 创建审批者Approver groupLeader new GroupLeader();Approver deptManager new DeptManager();Approver generalManager new GeneralManager();// 构建责任链组长→部门经理→总经理groupLeader.setNextApprover(deptManager);deptManager.setNextApprover(generalManager);// 模拟请假请求LeaveRequest request1 new LeaveRequest(张三, 1); // 1天组长处理LeaveRequest request2 new LeaveRequest(李四, 2); // 2天部门经理处理LeaveRequest request3 new LeaveRequest(王五, 5); // 5天总经理处理// 发送请求从链的起点开始groupLeader.handleRequest(request1);groupLeader.handleRequest(request2);groupLeader.handleRequest(request3);}
}
责任链模式代码