责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)
一、责任链模式核心概念解析
(一)模式定义与本质
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是将多个处理者对象连成一条链,并沿着这条链传递请求,直到有某个处理者对象处理它为止。这种模式通过将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,从而避免请求发送者与具体处理者之间的紧耦合。
责任链模式的本质可以概括为:传递请求,推卸责任。每个处理者只负责处理自己职责范围内的请求,对于超出职责范围的请求,则将其传递给链中的下一个处理者,形成一个灵活请求处理链条。
(二)核心应用场景
- 多级审批流程:如请假审批、费用报销审批等,不同级别的审批者处理不同额度或类型的请求。
- 过滤链场景:例如日志处理中的多级过滤、HTTP 请求的过滤器链。
- 错误处理链:在复杂系统中,不同类型的错误由不同的处理器进行处理。
- 事件处理机制:图形界面开发中,事件可能需要多个组件依次处理,如按钮点击事件可能先由按钮处理,再传递给容器组件。
(三)模式优缺点分析
优点:
- 解耦请求发送者与处理者:发送者无需知道具体哪个处理者处理请求,只需将请求发送到链上。
- 动态灵活:可以在运行时动态调整责任链的顺序,新增或删除处理者,而无需修改客户端代码。
- 符合开闭原则:新增处理者只需实现接口并加入链中,不影响现有代码。
缺点:
- 请求可能未被处理:如果责任链中没有处理者能够处理该请求,可能导致请求丢失,需要在链尾设置默认处理者。
- 调试难度增加:请求的处理路径可能较长,调试时需要跟踪整个链的处理过程。
- 性能开销:每个请求都需要沿着链进行传递,可能会带来一定的性能损失,尤其是在链较长时。
二、责任链模式的核心角色与 UML 结构
(一)四大核心角色
- 抽象处理者(Handler):定义处理请求的接口,包含一个指向后继处理者的引用,并实现默认的请求传递方法(如设置下一个处理者、传递请求等)。
- 具体处理者(Concrete Handler):实现抽象处理者定义的处理方法,判断是否能够处理当前请求,若能则处理,否则将请求传递给后继处理者。
- 请求对象(Request):封装请求的相关信息,供处理者判断是否需要处理。
- 客户端(Client):创建责任链,并向链的头部发送请求。
(二)UML 类图结构
plantuml
@startuml
class Client{- Handler headHandler+ void sendRequest(Request request)
}
class Handler{- Handler nextHandler+ setNextHandler(Handler handler)+ handleRequest(Request request)
}
class ConcreteHandler1{+ handleRequest(Request request)
}
class ConcreteHandler2{+ handleRequest(Request request)
}
class Request{- Object data// getters and setters
}
Client --> Handler
Handler <|-- ConcreteHandler1
Handler <|-- ConcreteHandler2
Handler "1" -- "0..1" Handler : nextHandler
@enduml
(三)关键交互流程
- 客户端创建具体处理者实例,并通过
setNextHandler
方法将处理者连接成链,确定链的顺序。 - 客户端向链的头部处理者(通常是第一个处理者)发送请求。
- 头部处理者接收到请求后,先判断自己是否能够处理该请求:
- 若能处理,则执行具体的处理逻辑,处理完毕后根据需要决定是否继续传递请求(通常处理后不再传递)。
- 若不能处理,则调用
nextHandler
的handleRequest
方法,将请求传递给下一个处理者。
- 后续处理者重复上述步骤,直到请求被处理或到达链尾。
三、Java 手写责任链模式实现 —— 请假审批系统
(一)业务场景说明
假设我们需要实现一个员工请假审批系统,请假流程如下:
- 请假天数≤1 天,由直属领导审批。
- 1 天 < 请假天数≤3 天,由部门经理审批。
- 3 天 < 请假天数≤7 天,由总监审批。
- 请假天数 > 7 天,由总经理审批。
(二)实现步骤详解
1. 定义请求类(Request)
java
public class LeaveRequest {private String employeeName; // 员工姓名private int days; // 请假天数private String reason; // 请假原因public LeaveRequest(String employeeName, int days, String reason) {this.employeeName = employeeName;this.days = days;this.reason = reason;}// getters and setterspublic String getEmployeeName() { return employeeName; }public int getDays() { return days; }public String getReason() { return reason; }
}
2. 定义抽象处理者(Handler)
java
public abstract class Approver {protected Approver nextApprover; // 后继处理者// 设置下一个处理者public void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}// 处理请求的抽象方法public abstract void processRequest(LeaveRequest request);
}
3. 实现具体处理者(Concrete Handler)
直属领导(TeamLeaderApprover):
java
public class TeamLeaderApprover extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() <= 1) {System.out.println("直属领导" + this + "审批通过:" + request.getEmployeeName() + "请假" + request.getDays() + "天,原因:" + request.getReason());} else {if (nextApprover != null) {nextApprover.processRequest(request); // 传递给下一个处理者} else {System.out.println("请假天数过长,无人审批!");}}}
}
部门经理(DepartmentManagerApprover):
java
public class DepartmentManagerApprover extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() > 1 && request.getDays() <= 3) {System.out.println("部门经理" + this + "审批通过:" + request.getEmployeeName() + "请假" + request.getDays() + "天,原因:" + request.getReason());} else {if (nextApprover != null) {nextApprover.processRequest(request);} else {System.out.println("请假天数过长,无人审批!");}}}
}
总监(DirectorApprover):
java
public class DirectorApprover extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() > 3 && request.getDays() <= 7) {System.out.println("总监" + this + "审批通过:" + request.getEmployeeName() + "请假" + request.getDays() + "天,原因:" + request.getReason());} else {if (nextApprover != null) {nextApprover.processRequest(request);} else {System.out.println("请假天数过长,无人审批!");}}}
}
总经理(GeneralManagerApprover):
java
public class GeneralManagerApprover extends Approver {@Overridepublic void processRequest(LeaveRequest request) {if (request.getDays() > 7) {System.out.println("总经理" + this + "审批通过:" + request.getEmployeeName() + "请假" + request.getDays() + "天,原因:" + request.getReason());} else {if (nextApprover != null) {nextApprover.processRequest(request);} else {System.out.println("请假天数过长,无人审批!");}}}
}
4. 客户端调用(Client)
java
public class Client {public static void main(String[] args) {// 创建处理者实例Approver teamLeader = new TeamLeaderApprover();Approver departmentManager = new DepartmentManagerApprover();Approver director = new DirectorApprover();Approver generalManager = new GeneralManagerApprover();// 构建责任链teamLeader.setNextApprover(departmentManager);departmentManager.setNextApprover(director);director.setNextApprover(generalManager);// 创建请求LeaveRequest request1 = new LeaveRequest("张三", 1, "病假");LeaveRequest request2 = new LeaveRequest("李四", 2, "事假");LeaveRequest request3 = new LeaveRequest("王五", 5, "婚假");LeaveRequest request4 = new LeaveRequest("赵六", 10, "产假");// 发送请求teamLeader.processRequest(request1);teamLeader.processRequest(request2);teamLeader.processRequest(request3);teamLeader.processRequest(request4);}
}
5. 运行结果
plaintext
直属领导TeamLeaderApprover@1540e19d审批通过:张三请假1天,原因:病假
部门经理DepartmentManagerApprover@677327b6审批通过:李四请假2天,原因:事假
总监DirectorApprover@14ae5a5审批通过:王五请假5天,原因:婚假
总经理GeneralManagerApprover@7f31245a审批通过:赵六请假10天,原因:产假
(三)实现关键点解析
- 处理者链的构建:通过
setNextApprover
方法将处理者依次连接,形成责任链。链的顺序非常重要,决定了请求的处理顺序,通常按照处理者的处理能力从小到大或从低到高排列。 - 请求处理逻辑:每个具体处理者首先判断自己是否能处理当前请求,处理逻辑可以是基于请求的属性(如请假天数)、权限等。若不能处理,则传递给下一个处理者,注意要处理
nextApprover
为null
的情况(链尾),避免空指针异常。 - 抽象处理者的设计:抽象类中定义了后继处理者的引用和设置方法,以及处理请求的抽象方法,确保所有具体处理者具有一致的接口。
四、责任链模式的优化与扩展
(一)带返回值的责任链
在上述案例中,处理者处理请求后通常不会返回结果,但在实际场景中,可能需要处理者返回处理结果(如审批是否通过、处理后的数据等)。此时可以修改processRequest
方法,使其返回一个结果对象。
修改抽象处理者:
java
public abstract class Approver {// ... 其他代码不变public abstract ApproveResult processRequest(LeaveRequest request);
}// 审批结果类
public class ApproveResult {private boolean approved;private String message;// 构造方法、getters and setters
}
具体处理者返回结果:
java
public class TeamLeaderApprover extends Approver {@Overridepublic ApproveResult processRequest(LeaveRequest request) {ApproveResult result = new ApproveResult();if (request.getDays() <= 1) {result.setApproved(true);result.setMessage("直属领导审批通过");} else {if (nextApprover != null) {result = nextApprover.processRequest(request); // 传递请求并获取结果} else {result.setApproved(false);result.setMessage("无人审批");}}return result;}
}
(二)动态构建责任链
在客户端硬编码责任链的顺序不够灵活,特别是当链的结构可能频繁变化时。可以通过配置文件(如 XML、JSON)或数据库来存储处理者的顺序,运行时动态加载并构建责任链。
示例:从配置文件加载责任链
- 创建配置文件
approvers.config
:
properties
approver1=com.example.TeamLeaderApprover
approver2=com.example.DepartmentManagerApprover
approver3=com.example.DirectorApprover
approver4=com.example.GeneralManagerApprover
- 客户端动态加载处理者并构建链:
java
public class Client {public static void main(String[] args) throws Exception {Properties properties = new Properties();properties.load(new FileInputStream("approvers.config"));List<Approver> approvers = new ArrayList<>();for (int i = 1; i <= properties.size(); i++) {String className = properties.getProperty("approver" + i);Class<?> clazz = Class.forName(className);Approver approver = (Approver) clazz.newInstance();approvers.add(approver);}// 构建责任链for (int i = 0; i < approvers.size() - 1; i++) {approvers.get(i).setNextApprover(approvers.get(i + 1));}// 发送请求...}
}
(三)使用 Spring 实现责任链(依赖注入方式)
在 Spring 框架中,可以利用依赖注入来管理处理者实例,并通过 AOP 或自定义注解来简化责任链的构建。
步骤如下:
- 定义处理者接口和抽象类(同前文)。
- 将具体处理者声明为 Spring Bean:
java
@Component
public class TeamLeaderApprover extends Approver {// ... 处理逻辑
}
- 使用
@Autowired
注入所有处理者,并按照顺序构建链:
java
@Service
public class ApproveService {private List<Approver> approvers;@Autowiredpublic ApproveService(List<Approver> approvers) {// 假设approvers已按顺序注入,可能需要通过@Order注解排序for (int i = 0; i < approvers.size() - 1; i++) {approvers.get(i).setNextApprover(approvers.get(i + 1));}}public void approve(LeaveRequest request) {approvers.get(0).processRequest(request); // 从链头开始处理}
}
五、责任链模式与其他设计模式的对比
(一)vs 策略模式(Strategy Pattern)
对比维度 | 责任链模式 | 策略模式 |
---|---|---|
目的 | 处理请求链,一个请求可能被多个处理者处理 | 封装不同算法策略,选择其中一种算法处理请求 |
结构 | 处理者之间形成链式结构,请求沿链传递 | 策略类之间是平行的,客户端直接选择具体策略 |
交互方式 | 处理者自动传递请求,无需客户端干预 | 客户端主动选择具体策略并调用 |
适用场景 | 请求需要按顺序经过多个处理者处理 | 需要动态切换不同算法实现 |
(二)vs 状态模式(State Pattern)
对比维度 | 责任链模式 | 状态模式 |
---|---|---|
核心思想 | 传递请求,多个处理者可能处理同一个请求 | 根据对象状态变化改变行为,状态之间自动切换 |
处理者关系 | 处理者之间是链式的,无状态关联 | 状态对象之间通常是互斥的,对象当前状态决定行为 |
请求处理 | 请求可能被多个处理者处理(取决于链的顺序) | 请求由当前状态对象处理,一个请求对应一个状态处理 |
(三)vs 观察者模式(Observer Pattern)
对比维度 | 责任链模式 | 观察者模式 |
---|---|---|
通信方向 | 请求由发送者向处理者单向传递 | 主题与观察者之间是双向通信(主题通知观察者) |
处理方式 | 处理者按顺序处理请求,通常只有一个处理者处理 | 多个观察者可以同时响应主题的变化 |
解耦程度 | 发送者与处理者解耦,但处理者之间有链式关联 | 主题与观察者解耦,观察者之间无关联 |
六、最佳实践与注意事项
(一)链的长度控制
避免责任链过长,过长的链会导致请求处理效率低下,且调试困难。可以通过日志记录链的处理过程,或者在链中设置最大处理深度限制。
(二)链尾处理
必须确保责任链有一个最终处理者(如默认处理者),避免请求未被处理的情况。例如在请假审批系统中,总经理作为链尾处理者,处理所有超过 7 天的请假请求。
(三)处理者的单一职责
每个处理者应专注于处理特定类型的请求,遵循单一职责原则,避免处理者承担过多职责,导致逻辑复杂。
(四)日志与调试
在处理者中加入日志记录,记录请求的处理过程,方便调试和问题排查。例如记录请求进入处理者的时间、处理结果、传递给下一个处理者的时间等。
(五)性能优化
如果责任链中的处理者较多,且大部分请求需要传递到链尾才能处理,可以考虑使用缓存或预处理机制,提前判断请求应该由哪个处理者处理,避免逐个传递请求。
七、总结与拓展
责任链模式通过将处理者连成链条,实现了请求处理的解耦和灵活扩展,是处理多级流程、过滤链等场景的理想选择。在 Java 开发中,我们可以通过抽象类和接口定义处理者,通过组合模式构建责任链,结合 Spring 等框架实现更高效的管理。
随着微服务架构的普及,责任链模式的思想也被应用到分布式系统中,如请求拦截链、网关过滤器链等。深入理解责任链模式的核心原理,能够帮助我们更好地设计可扩展的系统架构,应对复杂的业务需求变化。
在实际项目中,是否选择责任链模式需要根据具体场景权衡,考虑请求处理的复杂度、处理者的动态性以及系统的可维护性等因素。通过合理应用责任链模式,我们可以构建出更加灵活、健壮的软件系统。
相关文章:

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)
一、责任链模式核心概念解析 (一)模式定义与本质 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是将多个处理者对象连成一条链,并沿着这条链传递请求,直到有某…...
nlp中的频率就是权重吗
🔢 一、“频率”是什么? 在 NLP 中,**词频(frequency)**通常指的是: 某个单词或 token 在语料库中出现的次数(或比例) 举例: "The cat sat on the mat. The cat i…...
融智学“新五常”框架:五维方式的重构与协同
融智学“新五常”框架:五维方式的重构与协同 一、理论基底:从传统老五常到当代新五常的范式跃迁 邹晓辉教授提出的新五常(生活方式DBA、学习方式DBA、工作方式DBA、旅行方式DBA、娱乐方式DBA),本质是将融智学的核心原…...

wechat-003-学习笔记
1.路由跳转页面:携带的参数会出现在onlaod中的options中。 注意:原生小程序对路由传参的长度也有限制,过长会被截掉。 2.wx.setNavigationBarTitle(Object object) 动态设置当前页面的标题 3.在根目录中的app.json文件中配置 后台播放音乐的能…...

【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知
文章概要: 本文是一篇详细的技术教程,介绍如何使用魔搭社区(ModelScope)的GPU资源来进行LLaMA-Factory的模型微调。文章分为11个主要步骤,从环境准备到最终的模型测试,系统地介绍了整个微调流程。主要内容包…...
基于MATLAB编程针对NCV检测数据去漂移任务的完整解决方案
以下为针对NCV检测数据去漂移任务的完整解决方案,基于MATLAB编程实现,结构清晰,内容详实,满足技术深度。 NCV信号尾部漂移处理与分析 1. 任务背景与目标 神经传导速度(NCV)检测信号易受环境干扰与设备漂移…...

【数据结构】哈希表的实现
文章目录 1. 哈希的介绍1.1 直接定址法1.2 哈希冲突1.3 负载因子1.4 哈希函数1.4.1 除法散列法/除留余数法1.4.2 乘法散列法1.4.3 全域散列法 1.5 处理哈希冲突1.5.1 开放地址法1.5.1.1 线性探测1.5.1.2 二次探测1.5.1.3 双重探测1.5.1.4 三种探测方法对比 1.6.3 链地址法 2. 哈…...

永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器
一、基本原理 先给出IP速度控制器还是PI速度控制器的传递函数: PI调节器 IP调节器 从IP速度控制器还是PI速度控制器的传递函数可以看出,系统的抗负载转矩扰动能力相同,因此虽然采用IP速度控制器改善了转速环的超调问题,但仍然需要通过其他途…...

RabbitMQ 应用 - SpringBoot
以下介绍的是基于 SpringBoot 的 RabbitMQ 开发介绍 Spring Spring AMQP RabbitMQ RabbitMQ tutorial - "Hello World!" | RabbitMQ 工程搭建步骤: 1.引入依赖 2.编写 yml 配置,配置基本信息 3.编写生产者代码 4.编写消费者代码 定义监听类,使用 RabbitListener…...

基于递归思想的系统架构图自动化生成实践
文章目录 一、核心思想解析二、关键技术实现1. 动态布局算法2. 样式规范集成3. MCP服务封装三、典型应用场景四、最佳实践建议五、扩展方向一、核心思想解析 本系统通过递归算法实现了Markdown层级结构到PPTX架构图的自动转换,其核心设计思想包含两个维度: 数据结构递归:将…...

OpenGL Chan视频学习-9 Index Buffers inOpenGL
bilibili视频链接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站: docs.gl 说明: 1.之后就不再单独整理网站具体函数了,网站直接翻译会…...
《基于AIGC的智能化多栈开发新模式》研究报告重磅发布! ——AI重塑软件工程,多栈开发引领未来
在人工智能技术迅猛发展的浪潮下,软件开发领域正经历一场前所未有的范式革命。在此背景下,由贝壳找房(北京)科技有限公司、中国信息通信研究院云计算与大数据研究所联合编写,阿里、腾讯、北京大学、南京大学、同济大学…...
热门大型语言模型(LLM)应用开发框架
我们来深入探索这些强大的大型语言模型(LLM)应用开发框架,并且我会尝试用文本形式描述一些核心的流程图,帮助您更好地理解它们的工作机制。由于我无法直接生成图片,我会用文字清晰地描述流程图的各个步骤和连接。 Lang…...

Nginx安全防护与HTTPS部署实战
目录 前言一. 核心安全配置1. 隐藏版本号2. 限制危险请求方法3. 请求限制(CC攻击防御)(1)使用nginx的limit_req模块限制请求速率(2)压力测试验证 4. 防盗链 二. 高级防护1. 动态黑名单(1&#x…...

JAVA重症监护系统源码 ICU重症监护系统源码 智慧医院重症监护系统源码
智慧医院重症监护系统源码 ICU重症监护系统源码 开发语言:JavaVUE ICU护理记录:实现病人数据的自动采集,实时记录监护过程数据。支持主流厂家的监护仪、呼吸机等床旁数字化设备的数据采集。对接检验检查系统,实现自动化录入。喜…...
静态资源js,css免费CDN服务比较
静态资源js,css免费CDN服务比较 分析的 CDN 服务列表: BootCDN (https://cdn.bootcdn.net/ajax/libs)jsDelivr (主域名) (https://cdn.jsdelivr.net/npm)jsDelivr (Gcore 镜像) (https://gcore.jsdelivr.net/npm)UNPKG (https://unpkg.com)ESM (https://esm.sh)By…...
组合型回溯+剪枝
本篇基于b站灵茶山艾府。 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#…...

python:机器学习(KNN算法)
本文目录: 一、K-近邻算法思想二、KNN的应用方式( 一)分类流程(二)回归流程 三、API介绍(一)分类预测操作(二)回归预测操作 四、距离度量方法(一)…...

【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南
#工作记录 前言 在量化交易的学习探索中,偶然接触到 2017 年开源的 abu 量化交易库,其代码结构和思路对新手理解量化回测、指标分析等基础逻辑有一定参考价值。然而,当尝试在 2025 年的开发环境中部署这个久未更新的项目时,遇到…...

小程序 - 视图与逻辑
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言: “心有多大,舞台就有多大。” 📚推荐学习: 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒T…...

ChatGPT Plus/Pro 订阅教程(支持支付宝)
订阅 ChatGPT Plus GPT-4 最简单,成功率最高的方案 1. 登录 chat.openai.com 依次点击 Login ,输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后,点击左下角的 Upgrade to Plus,在弹窗中选择 Upgrade plan。 如果…...

[蓝帽杯 2022 初赛]网站取证_2
一、找到与数据库有关系的PHP文件 打开内容如下,发现数据库密码是函数my_encrypt()返回的结果。 二、在文件夹encrypt中找到encrypt.php,内容如下,其中mcrypt已不再使用,所以使用php>7版本可能没有执行结果,需要换成较低版本…...
vue3+Pinia+element-plus 后台管理系统项目实战记录
vue3Piniaelement-plus 后台管理系统项目实战记录 参考项目:https://www.bilibili.com/video/BV1L24y1n7tB 全局api provide、inject vue2 import api from/api vue.propotype.$api apithis.$api.xxxvue3 import api from/api app.provide($api, api)import {…...

安装 Node.js 和配置 cnpm 镜像源
一、安装 Node.js 方式一:官网下载(适合所有系统) 访问 Node.js 官网 推荐选择 LTS(长期支持)版本,点击下载安装包。 根据系统提示一步步完成安装。 方式二:通过包管理器安装(建…...

MacOS内存管理-删除冗余系统数据System Data
文章目录 一、问题复现二、解决思路三、解决流程四、附录 一、问题复现 以题主的的 Mac 为例,我们可以看到System Data所占数据高达77.08GB,远远超出系统所占内存 二、解决思路 占据大量空间的是分散在系统中各个位置Cache数据; 其中容量最…...
电脑开机后长时间黑屏,桌面图标和任务栏很久才会出现,但是可通过任务管理器打开应用程序,如何解决
目录 一、造成这种情况的主要原因(详细分析): (1)启动项过多,导致系统资源占用过高(最常见) 检测方法: (2)系统服务启动异常(常见&a…...

行为型:中介者模式
目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的:通过引入一个中介对象来封装一组对象之间的交互,解决对象间过度耦合、频繁交互的问题。不管是对象引用维护还是消息的转发&am…...

光谱相机在生态修复监测中的应用
光谱相机通过多维光谱数据采集与智能分析技术,在生态修复监测中构建起“感知-评估-验证”的全周期管理体系,其核心应用方向如下: 一、土壤修复效能量化评估 重金属污染动态监测 通过短波红外(1000-2500nm)波…...

吉林大学操作系统上机实验五(磁盘引臂调度算法(scan算法)实现)
本次实验无参考,从头开始实现。 一.实验内容 模拟实现任意一个磁盘引臂调度算法,对磁盘进行移臂操作列出基于该种算法的磁道访问序列,计算平均寻道长度。 二.实验设计 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。磁盘是可…...
【深度学习-pytorch篇】4. 正则化方法(Regularization Techniques)
正则化方法(Regularization Techniques) 1. 目标 理解什么是过拟合及其影响掌握常见正则化技术:L2 正则化、Dropout、Batch Normalization、Early Stopping能够使用 PyTorch 编程实现这些正则化方法并进行比较分析 2. 数据构造与任务设定 …...