购物网站线下推广方案,电子商务网站推广方法和技巧,网站发展的方向,编辑网页的工具有哪些Spring 设计模式之责任链模式 责任链模式用到的场景java举例 责任链模式
责任链模式#xff08;Chain of Responsibility#xff09;是一种行为设计模式#xff0c;它允许你将请求沿着处理者链进行传递。 每个处理者可以对请求进行处理#xff0c;也可以将请求传递给链中的… Spring 设计模式之责任链模式 责任链模式用到的场景java举例 责任链模式
责任链模式Chain of Responsibility是一种行为设计模式它允许你将请求沿着处理者链进行传递。 每个处理者可以对请求进行处理也可以将请求传递给链中的下一个处理者。这个模式使得你可以在不修改对象间连接的情况下动态地增加或删除责任。
用到的场景
强调链条传递每一个环节都处理一下 1.入参校验 多级校验将校验逻辑拆分为多个独立的处理器每个处理器负责一种或多种校验规则。这些处理器形成一条链式调用请求在处理器链上传递如果校验条件不通过则处理器不再向下传递请求直接返回错误信息若所有的处理器都通过检验则继续执行后续的业务逻辑。可复用性校验处理器可以独立开发和测试便于在不同场景下复用。 2. 权限校验 多级权限检查将权限校验逻辑拆分为多个处理器每个处理器负责一种或多种权限检查规则。这些处理器按顺序组成一条链请求如API调用或页面访问在链上传递每个处理器根据自己的职责检查请求是否满足相应的权限要求。细粒度控制通过多个处理器可以实现细粒度的权限控制比如角色检查、资源权限检查、操作权限检查等。动态调整权限处理器可以动态地添加、删除或修改以适应不同的安全需求或用户角色变化。 3. 工作流处理 任务分解将复杂的工作流程分解为多个独立的处理步骤每个步骤由一个或多个处理器负责。顺序执行处理器按照预设的顺序依次执行每个处理器处理完自己的任务后将请求传递给下一个处理器。动态扩展通过配置或编程方式动态地添加、删除或修改处理器以适应不同的工作流程需求。 4. 事件处理 事件监听在Spring框架中可以使用责任链模式来监听和处理事件。每个处理器都可以注册为事件监听器当事件发生时按照注册的顺序依次调用处理器的处理方法。事件分发事件分发器负责将事件对象传递给链中的第一个处理器处理器根据事件类型和自己的职责决定是否处理该事件或者将事件传递给下一个处理器。 5. 异常处理 异常捕获在业务逻辑执行过程中可能会遇到各种异常情况。使用责任链模式可以将异常处理逻辑拆分为多个处理器每个处理器负责捕获和处理一种或多种异常类型。异常传递当一个处理器无法处理当前异常时可以将异常对象传递给下一个处理器直到找到合适的处理器为止。 6. 请求处理 请求分发在Web应用程序中请求处理器可以形成一个责任链用于处理不同类型的HTTP请求。每个处理器都可以根据自己的职责决定是否处理该请求或者将请求传递给下一个处理器。请求过滤在请求到达控制器之前可以使用责任链模式对请求进行过滤和预处理比如身份验证、参数校验、日志记录等。 java举例
package com.example.customer.controller;// 定义一个处理请求的接口
interface Handler {// 设置下一个处理者void setNextHandler(Handler nextHandler);// 处理请求的方法void handleRequest(int days);
}// 具体的处理者类比如部门经理实现Handler接口
class DepartmentManager implements Handler {private Handler nextHandler;Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler nextHandler;}Overridepublic void handleRequest(int days) {if (days 5) {System.out.println(部门经理批准了请假 days 天。);} else {if (nextHandler ! null) {nextHandler.handleRequest(days);} else {System.out.println(没有合适的领导可以批准请假 days 天。);}}}
}// 具体的处理者类比如总经理实现Handler接口
class GeneralManager implements Handler {private Handler nextHandler;Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler nextHandler;}Overridepublic void handleRequest(int days) {if (days 10) {System.out.println(总经理批准了请假 days 天。);} else {if (nextHandler ! null) {nextHandler.handleRequest(days);} else {System.out.println(没有合适的领导可以批准请假 days 天。);}}}
}// 具体的处理者类比如董事长实现Handler接口
class Chairman implements Handler {Overridepublic void setNextHandler(Handler nextHandler) {// 董事长作为最高级领导不需要设置下一个处理者// 这里可以不做任何操作或者抛出一个异常表示不应该调用此方法// 但为了符合接口定义我们还是保留这个方法体为空}Overridepublic void handleRequest(int days) {if (days 10) {System.out.println(董事长批准了请假 days 天。);} else {// 理论上董事长不会处理小于等于10天的请假但这里为了完整性加上System.out.println(董事长不处理小于等于10天的请假请求。);}// 注意董事长没有下一个处理者所以不需要调用nextHandler.handleRequest(days);}}public class ChainOfResponsibilityDemo {public static void main(String[] args) {// 创建处理者对象-部门经理Handler departmentManager new DepartmentManager();// 创建处理者对象-总经理Handler generalManager new GeneralManager();// 创建处理者对象-董事长Handler chairman new Chairman();//设置部门经理下一个处理者总经理departmentManager.setNextHandler(generalManager);//设置总经理下一个处理者董事长generalManager.setNextHandler(chairman);// 提交请假请求departmentManager.handleRequest(3); // 该假条是部门经理进行批准的departmentManager.handleRequest(7); // 该假条是总经理进行批准的departmentManager.handleRequest(11); // 该假条是总经理进行批准的}
}输出
部门经理批准了请假 3 天。
总经理批准了请假 7 天。
董事长批准了请假 11 天。