Java 责任链模式 减少 if else 实战案例

一、场景介绍

假设有这么一个朝廷,它有 县-->府-->省-->朝廷,四级行政机构。

这四级行政机构的关系如下表:

1、县-->府-->省-->朝廷:有些地方有完整的四级行政机构。

2、县-->府-->朝廷:直隶府,朝廷直隶。

3、县-->省-->朝廷:有些地方可以没有府级行政机构。

4、县-->朝廷:直隶县,朝廷直隶。

朝廷规定,

县地方收上来的赋税,县衙可以留存10%,府署可以留存20%,省署可以留存30%。

但倘若下一级行政机构缺失,它的比例累加到上一级。

最后可能的赋税分配比例如下:

现在有一个县,收上来10万两白银,请设计一种模型,来计算各个层级行政机构所能分配到的赋税金额。

二、思路分析

如果按照正常的程序设计思路,伪代码可能如下:

    public void computerTax() {if (县的上级是朝廷) {计算县的赋税计算朝廷的赋税} else if(县的上级是府) {计算县的赋税获取县的上级府if (府的上级是朝廷) {计算府的赋税计算朝廷的赋税} else if(府的上级是省) {计算省的赋税计算朝廷的赋税}} else if(县的上级是省) {计算省的赋税计算朝廷的赋税}}

分支语句特别多,条件判断又臭又长,可读性跟可维护性都很差,这还只是四级,如果行政区划层级再多一点,那么这个方法可能会有上千行,堆屎山一样。

下面,我们用责任链来改造这个方法。

三、代码实现

1、枚举设计

设计一个枚举,用来表示行政等级

import lombok.AllArgsConstructor;
import lombok.Getter;/*** 行政等级枚举*/
@AllArgsConstructor
@Getter
public enum GovGradeEnum {IMPERIAL_COURT(0, "朝廷"),PROVINCE(1, "省"),RESIDENCE(2, "府"),COUNTY(3, "县");private final Integer code;private final String name;
}

2、表结构设计

create table gov_division
(id        int auto_increment comment '主键'primary key,name      varchar(20) not null comment '区划名称',grade     int         not null comment '区划所处等级',parent_id int         not null comment '区划上一级ID'
)comment '行政区划表';
create table tax
(id          int auto_increment comment '主键'primary key,grade       int            not null comment '区划等级',division_id int            not null comment '区划ID',rate        decimal(10, 2) not null comment '赋税比例',amount      decimal(10, 2) not null comment '赋税金额'
) comment '赋税分配表';

3、对象设计

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;import lombok.Data;@Data
@TableName("gov_division")
public class GovDivision implements Serializable {private static final long serialVersionUID = 1L;/** 主键 */@TableId(value = "id", type = IdType.AUTO)private Integer id;/** 区划名称 */private String name;/** 区划所处等级 */private Integer grade;/** 区划上一级ID */private Integer parentId;
}
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.*;/*** 行政区划表 Mapper 接口*/
@Mapper
public interface GovDivisionMapper extends BaseMapper<GovDivision> {
}

给对象添加 @Builder 注解是为了方便后面用构造器方式构造对象。

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;import lombok.Builder;
import lombok.Data;@Data
@TableName("tax")
@Builder
public class Tax implements Serializable {private static final long serialVersionUID = 1L;/** 主键 */@TableId(value = "id", type = IdType.AUTO)private Integer id;/** 区划等级 */private Integer grade;/** 区划ID */private Integer divisionId;/** 赋税比例 */private BigDecimal rate;/** 赋税金额 */private BigDecimal amount;
}
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.*;import java.util.List;/***  赋税 Mapper 接口*/
@Mapper
public interface TaxMapper extends BaseMapper<Tax> {void batchInsert(List<Tax> list);
}

 TaxMapper.xml:

<insert id="batchInsert" parameterType="java.util.List">INSERT INTO tax (grade, division_id, rate, amount) VALUES<foreach collection="list" item="item" index="index" separator=",">(#{item.grade}, #{item.divisionId}, #{item.rate}, #{item.amount})</foreach>
</insert>

 4、责任链设计

4.1 责任处理接口

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;/** 责任处理接口 */
public interface TaxHandler {/*** 责任链处理接口* @param param 入参* @param config 赋税比例配置* @param sum 累计比例* @param use 使用了多少比例* @param taxList 生成的赋税列表*/void handle(ReqParam param, Map<Integer, BigDecimal> config, BigDecimal sum, BigDecimal use, List<Tax> taxList);/** 构造赋税默认方法 */default Tax buildTax(Integer divisionId, Integer grade, BigDecimal rate, BigDecimal amount) {returnTax.builder().divisionId(divisionId).grade(grade).rate(rate).amount(amount).build();}
}
import lombok.Data;
import java.math.BigDecimal;@Data
public class ReqParam {/** 区划ID */private Integer id;/** 区划等级 */private Integer grade;/** 上级区划ID */private Integer parentId;/** 今年赋税总额 */private BigDecimal totalTax;
}

 4.2 责任处理实现类

我们实现 县、府、省、朝廷 四个实现类,让他们组成

县-->府-->省-->朝廷  这样一条责任链,并在请求参数中带上 grade,让每一个层级只处理自己 grade 的请求。

import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.List;
import java.util.Map;/** 县处理者 */
@Service
@AllArgsConstructor
public class CountryTaxHandler implements TaxHandler {/** 引用府处理者 */private final ResidenceTaxHandler residenceTaxHandler;private final GovDivisionMapper govDivisionMapper;@Overridepublic void handle(ReqParam param, Map<Integer, BigDecimal> config,BigDecimal sum, BigDecimal use, List<Tax> taxList) {sum = sum.add(config.get(GovGradeEnum.COUNTY.getCode()));if (GovGradeEnum.COUNTY.getCode().equals(param.getGrade())) {taxList.add(buildTax(param.getId(), param.getGrade(), sum,param.getTotalTax().multiply(sum)));use = use.add(sum);sum = BigDecimal.ZERO;// 获取上级GovDivision govDivision = govDivisionMapper.selectById(param.getParentId());BeanUtils.copyProperties(govDivision, param);// 责任链向下传递residenceTaxHandler.handle(param, config, sum, use, taxList);} else {// 责任链向下传递residenceTaxHandler.handle(param, config, sum, use, taxList);}}
}
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.List;
import java.util.Map;/** 府处理者 */
@Service
@AllArgsConstructor
public class ResidenceTaxHandler implements TaxHandler {/** 引用省处理者 */private final ProvinceTaxHandler provinceTaxHandler;private final GovDivisionMapper govDivisionMapper;@Overridepublic void handle(ReqParam param, Map<Integer, BigDecimal> config,BigDecimal sum, BigDecimal use, List<Tax> taxList) {sum = sum.add(config.get(GovGradeEnum.RESIDENCE.getCode()));if (GovGradeEnum.RESIDENCE.getCode().equals(param.getGrade())) {taxList.add(buildTax(param.getId(), param.getGrade(), sum,param.getTotalTax().multiply(sum)));use = use.add(sum);sum = BigDecimal.ZERO;// 获取上级GovDivision govDivision = govDivisionMapper.selectById(param.getParentId());BeanUtils.copyProperties(govDivision, param);provinceTaxHandler.handle(param, config, sum, use, taxList);} else {provinceTaxHandler.handle(param, config, sum, use, taxList);}}
}
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.List;
import java.util.Map;/** 省处理者 */
@Service
@AllArgsConstructor
public class ProvinceTaxHandler implements TaxHandler {/** 引用朝廷 */private ImperialCourtTaxHandler imperialCourtTaxHandler;private final GovDivisionMapper govDivisionMapper;@Overridepublic void handle(ReqParam param, Map<Integer, BigDecimal> config,BigDecimal sum, BigDecimal use, List<Tax> taxList) {sum = sum.add(config.get(GovGradeEnum.PROVINCE.getCode()));if (GovGradeEnum.PROVINCE.getCode().equals(param.getGrade())) {taxList.add(buildTax(param.getId(), param.getGrade(), sum,param.getTotalTax().multiply(sum)));use = use.add(sum);sum = BigDecimal.ZERO;// 获取上级GovDivision govDivision = govDivisionMapper.selectById(param.getParentId());BeanUtils.copyProperties(govDivision, param);imperialCourtTaxHandler.handle(param, config, sum, use, taxList);} else {imperialCourtTaxHandler.handle(param, config, sum, use, taxList);}}
}
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.List;
import java.util.Map;/** 朝廷 */
@Service
@AllArgsConstructor
public class ImperialCourtTaxHandler implements TaxHandler {@Overridepublic void handle(ReqParam param, Map<Integer, BigDecimal> config,BigDecimal sum, BigDecimal use, List<Tax> taxList) {BigDecimal rate = BigDecimal.ONE.subtract(use);if (GovGradeEnum.IMPERIAL_COURT.getCode().equals(param.getGrade())) {taxList.add(buildTax(param.getId(), param.getGrade(), rate,param.getTotalTax().multiply(rate)));}// 责任链结束}
}

五、测试用例

1、直隶县1今年交了10万两白银:

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest(classes = AlMallApplication.class)
@Slf4j
public class TaxTest {/** 税收留存比例配置类,这里为了简单自己写死,也可以来自数据库 */private Map<Integer, BigDecimal> config;@Autowiredprivate TaxMapper taxMapper;@Autowiredprivate CountryTaxHandler countryTaxHandler;@Autowiredprivate GovDivisionMapper govDivisionMapper;@Beforepublic void init() {config = new HashMap<>();config.put(GovGradeEnum.COUNTY.getCode(), BigDecimal.valueOf(0.1));config.put(GovGradeEnum.RESIDENCE.getCode(), BigDecimal.valueOf(0.2));config.put(GovGradeEnum.PROVINCE.getCode(), BigDecimal.valueOf(0.3));}@Testpublic void test1() {// 直隶县1-->朝廷GovDivision country = govDivisionMapper.selectById(2);ReqParam param = new ReqParam();// 直隶县1 今年交了10万两白银param.setTotalTax(BigDecimal.valueOf(10));BeanUtils.copyProperties(country, param);List<Tax> list = new ArrayList<>();countryTaxHandler.handle(param, config, BigDecimal.ZERO, BigDecimal.ZERO, list);taxMapper.batchInsert(list);}
}

2、无府县1今年交了10万两白银

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest(classes = AlMallApplication.class)
@Slf4j
public class TaxTest {/** 税收留存比例配置类,这里为了简单自己写死,也可以来自数据库 */private Map<Integer, BigDecimal> config;@Autowiredprivate TaxMapper taxMapper;@Autowiredprivate CountryTaxHandler countryTaxHandler;@Autowiredprivate GovDivisionMapper govDivisionMapper;@Beforepublic void init() {config = new HashMap<>();config.put(GovGradeEnum.COUNTY.getCode(), BigDecimal.valueOf(0.1));config.put(GovGradeEnum.RESIDENCE.getCode(), BigDecimal.valueOf(0.2));config.put(GovGradeEnum.PROVINCE.getCode(), BigDecimal.valueOf(0.3));}@Testpublic void test2() {// 无府县1-->无府省1-->朝廷GovDivision country = govDivisionMapper.selectById(4);ReqParam param = new ReqParam();// 无府县1 今年交了10万两白银param.setTotalTax(BigDecimal.valueOf(10));BeanUtils.copyProperties(country, param);List<Tax> list = new ArrayList<>();countryTaxHandler.handle(param, config, BigDecimal.ZERO, BigDecimal.ZERO, list);taxMapper.batchInsert(list);}
}

3、无省县1今年交了10万两白银

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest(classes = AlMallApplication.class)
@Slf4j
public class TaxTest {/** 税收留存比例配置类,这里为了简单自己写死,也可以来自数据库 */private Map<Integer, BigDecimal> config;@Autowiredprivate TaxMapper taxMapper;@Autowiredprivate CountryTaxHandler countryTaxHandler;@Autowiredprivate GovDivisionMapper govDivisionMapper;@Beforepublic void init() {config = new HashMap<>();config.put(GovGradeEnum.COUNTY.getCode(), BigDecimal.valueOf(0.1));config.put(GovGradeEnum.RESIDENCE.getCode(), BigDecimal.valueOf(0.2));config.put(GovGradeEnum.PROVINCE.getCode(), BigDecimal.valueOf(0.3));}@Testpublic void test3() {// 无省县1-->无省府1-->朝廷GovDivision country = govDivisionMapper.selectById(6);ReqParam param = new ReqParam();// 无省县1 今年交了10万两白银param.setTotalTax(BigDecimal.valueOf(10));BeanUtils.copyProperties(country, param);List<Tax> list = new ArrayList<>();countryTaxHandler.handle(param, config, BigDecimal.ZERO, BigDecimal.ZERO, list);taxMapper.batchInsert(list);}
}

4、正常县1今年交了10万两白银

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest(classes = AlMallApplication.class)
@Slf4j
public class TaxTest {/** 税收留存比例配置类,这里为了简单自己写死,也可以来自数据库 */private Map<Integer, BigDecimal> config;@Autowiredprivate TaxMapper taxMapper;@Autowiredprivate CountryTaxHandler countryTaxHandler;@Autowiredprivate GovDivisionMapper govDivisionMapper;@Beforepublic void init() {config = new HashMap<>();config.put(GovGradeEnum.COUNTY.getCode(), BigDecimal.valueOf(0.1));config.put(GovGradeEnum.RESIDENCE.getCode(), BigDecimal.valueOf(0.2));config.put(GovGradeEnum.PROVINCE.getCode(), BigDecimal.valueOf(0.3));}@Testpublic void test4() {// 正常县1-->正常府1-->正常省1-->朝廷GovDivision country = govDivisionMapper.selectById(9);ReqParam param = new ReqParam();// 正常县1 今年交了10万两白银param.setTotalTax(BigDecimal.valueOf(10));BeanUtils.copyProperties(country, param);List<Tax> list = new ArrayList<>();countryTaxHandler.handle(param, config, BigDecimal.ZERO, BigDecimal.ZERO, list);taxMapper.batchInsert(list);}}

六、总结

先说缺点:

责任链的缺点,是造成类的膨胀。

大家仔细观察上面的代码,会发现,责任处理类,好像是把刚开始的 if else 伪代码,分到一个个处理类里面去了而已。

而且使用设计模式,它甚至并没有提高代码的执行效率。

 优点:

写代码并不是做外包,写完就扔,它还得考虑可读性、可维护性和可扩展性。

可维护性和可扩展性的前提,就是可读性。

一段代码如果过几天,连自己都看不明白,那这种代码,它基本就没有什么可维护性了。

if else 不是不能写,而是如果分支太多,自己调试的时候,都不知道要走过多少 if else 才能到达自己的断点,那这样的代码,你怎么修改?改完你又怎么回归测试?

责任链的优点,恰恰就是它的可读性、可扩展性非常好。

每个处理类只处理自己职责范围内的消息,对于其他消息一律往下传。把变化封装在每一个类里面。对于上面的例子,如果现在有新的层级,我们只需要加一个枚举类型 grade,在加一个处理类,并把处理类加入到责任链里面,这样的可扩展性大大提高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目使用eslint+prettier管理项目格式化

代码格式化、规范化说明 使用eslintprettier进行格式化&#xff0c;vscode中需要安装插件ESLint、Prettier - Code formatter&#xff0c;且格式化程序选择为后者&#xff08;vue文件、js文件要分别设置&#xff09; 对于eslint规则&#xff0c;在格式化时不会全部自动调整&…

Leetcode 整数转罗马数字

这段代码的算法思想是基于罗马数字的减法规则&#xff0c;将整数转换为罗马数字的字符串表示。下面是详细的解释&#xff1a; 算法步骤&#xff1a; 定义数值和符号对应关系&#xff1a;代码中定义了两个数组&#xff1a;values 和 symbols。values 数组包含了罗马数字的数值&…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server &#xff1a;服务注册中心…

CAN通讯演示(U90-M24DR)

概述 CAN通讯一般用的不多&#xff0c;相比于Modbus通讯不是特别常见&#xff0c;但也会用到&#xff0c;下面介绍一下CAN通讯&#xff0c;主要用U90军用PLC演示一下具体的数据传输过程。想更具体的了解的话&#xff0c;可以自行上网学习&#xff0c;此处大致介绍演示。…

时序论文19|ICML24 : 一篇很好的时序模型轻量化文章,用1k参数进行长时预测

论文标题&#xff1a;SparseTSF: Modeling Long-term Time Series Forecasting with 1k Parameters 论文链接&#xff1a;https://arxiv.org/pdf/2402.01533 代码链接&#xff1a;https://github.com/lss-1138/SparseTSF 前言 最近读论文发现时间序列研究中&#xff0c;模型…

(动画版)排序算法 -希尔排序

文章目录 1. 希尔排序&#xff08;Shellsort&#xff09;1.1 简介1.2 希尔排序的步骤1.3 希尔排序的C实现1.4 时间复杂度1.5 空间复杂度1.6 希尔排序动画 1. 希尔排序&#xff08;Shellsort&#xff09; 1.1 简介 希尔排序&#xff08;Shells Sort&#xff09;&#xff0c;又…

Python学习从0到1 day26 第三阶段 Spark ④ 数据输出

半山腰太挤了&#xff0c;你该去山顶看看 —— 24.11.10 一、输出为python对象 1.collect算子 功能: 将RDD各个分区内的数据&#xff0c;统一收集到Driver中&#xff0c;形成一个List对象 语法&#xff1a; rdd.collect() 返回值是一个list列表 示例&#xff1a; from …

DNS解析库

DNS解析库 dnsDNS的解析库以及域名的详解解析库dns解析的端口dns域名的长度限制流程优先级在现实环境中实现内网的dns解析 练习&#xff08;Ubuntu内网实现DNS解析&#xff09;主服务器备服务器 dns 域名系统&#xff0c;域名和ip地址互相映射的一个分布式的数据库&#xff0c…

kafka 生产经验——数据积压(消费者如何提高吞吐量)

bit --> byte --> kb -->mb -->gb --> tb --> pb --> eb -> zb -->yb

【记录】公司管理平台部署:容器化部署

前置条件 技能要求 了解Docker基本使用和常用命令。会写Dockerfile文件。会写docker-compose文件环境要求 云服务器,已安装好安装Docker本机 IntelliJ IDEA 2022.1.3配置 配置服务器SSH连接 进入 Settings -> Tools -> SSH Configurations 点击加号创建SSH连接配置 填…

从零开始 blender插件开发

blender 插件开发 文章目录 blender 插件开发环境配置1. 偏好设置中开启相关功能2. 命令行打开运行脚本 API学习专有名词1. bpy.data 从当前打开的blend file中&#xff0c;加载数据。2. bpy.context 可用于获取活动对象、场景、工具设置以及许多其他属性。3. bpy.ops 用户通常…

el-table 行列文字悬浮超出屏幕宽度不换行的问题

修改前的效果 修改后的效果 ui框架 element-plus 在网上找了很多例子都没找到合适的 然后这个东西鼠标挪走就不显示 控制台也不好调试 看了一下El-table的源码 他这个悬浮文字用的el-prpper 包着的 所以直接改 .el-table .el-propper 设置为max-width:1000px 就可以了 吐槽一…

Tcp中的流量控制,拥塞控制,超时重传时间的选择,都附带相应例子说明

端口号的了解 通常进行通信时&#xff0c;发送方使用任意端口&#xff0c;指定接收方为指定端口&#xff0c;因为接收方在接收到后的需要根据发送方指定的接收方端口号&#xff0c;来选择使用哪一个服务进程进行处理。 端口号还可以分类为两个大类&#xff1a; TCP和UDP报文的…

Nextflow最佳实践:如何在云上高效处理大规模数据集

1. Nextflow 软件架构介绍 Nextflow 是一个用于简化数据驱动计算流程的工具&#xff0c;可以在各种计算环境中轻松部署。它采用了分布式计算和容器技术&#xff0c;实现了高度模块化、可重复性和可扩展性。NextFlow 的软件架构主要包括以下几个部分&#xff1a; 用户界面&…

一文看懂ERP、SCM、SRM、WMS、TMS、进销存管理系统

经常有人来私信问我ERP、SCM、SRM、WMS、TMS、进销存管理系统等等&#xff0c;它们听起来都很专业&#xff0c;但到底各自是什么&#xff1f;承担着怎样的角色呢&#xff1f;它们具体都有哪些功能&#xff1f;相互之间又存在怎样的关联&#xff0c;对企业而言又意味着什么呢&am…

深度学习——优化算法、激活函数、归一化、正则化

文章目录 &#x1f33a;深度学习面试八股汇总&#x1f33a;优化算法方法梯度下降 (Gradient Descent, GD)动量法 (Momentum)AdaGrad (Adaptive Gradient Algorithm)RMSProp (Root Mean Square Propagation)Adam (Adaptive Moment Estimation)AdamW 优化算法总结 经验和实践建议…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化&#xff0c;该数据集包含丰富的宠物狗图像样本…

星期-时间范围选择器 滑动选择时间 最小粒度 vue3

星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例 根据业务需要&#xff0c;实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段&#xff0c;并且可以通过快速选择组件来快速选择特定的时间范围。 如图&#xff1a; 功能介绍 时间范围选择&…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据&#xff1f; 面向高并发如何提高活动查询性能&#xff1f; 如何保证缓存一致性&#xff1f; 数据流 Redis数据结构设计 如…