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.rhkb.cn/news/471311.html

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

相关文章

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell脚本可以去上面的Gitee或Github代码仓库拉取。 支持的功能和系统&am…

EXCEL延迟退休公式

如图&#xff1a; A B为手工输入 C2EOMONTH(A2,B2*12) D2EOMONTH(C2,IF(C2>DATEVALUE("2025-1-1"),INT((DATEDIF(DATEVALUE("2025-1-1"),C2,"m")4)/4),0)) E2EOMONTH(A2,B2*12IF(EOMONTH(A2,B2*12)>DATEVALUE("2025-1-1"),INT(…

ARM架构中断与异常向量表机制解析

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…

论文翻译 | The Capacity for Moral Self-Correction in Large Language Models

摘要 我们测试了一个假设&#xff0c;即通过人类反馈强化学习&#xff08;RLHF&#xff09;训练的语言模型具有“道德自我纠正”的能力——避免产生有害的输出——如果指示这样做的话。我们在三个不同的实验中发现了支持这一假设的有力证据&#xff0c;每个实验都揭示了道德自…

华为云前台用户可挂载数据盘和系统盘是怎么做到的?

用户可以选择磁盘类型和容量&#xff0c;其后台是管理员对接存储设备 1.管理员如何在后台对接存储设备&#xff08;特指业务存储&#xff09; 1.1FusionSphere CPS&#xff08;Cloud Provisionivice&#xff09;云装配服务 它是first node https://10.200.4.159:8890 对接存…

【Excel】身份证号最后一位“X”怎么计算

大多数人身份证号最后一位都是数字&#xff0c;但有个别号码最后一位却是“X"。 如果你查百度&#xff0c;会得到如下答案&#xff1a; 当最后一位编码是10的时候&#xff0c;因为多出一位&#xff0c;所以就用X替换。 可大多数人不知道的是&#xff0c;这个10是怎么来的…

【常见问题解答】远程桌面无法复制粘贴的解决方法

提示:“奔跑吧邓邓子” 的常见问题专栏聚焦于各类技术领域常见问题的解答。涵盖操作系统(如 CentOS、Linux 等)、开发工具(如 Android Studio)、服务器软件(如 Zabbix、JumpServer、RocketMQ 等)以及远程桌面、代码克隆等多种场景。针对如远程桌面无法复制粘贴、Kuberne…

python解析网页上的json数据落地到EXCEL

安装必要的库 import requests import pandas as pd import os import sys import io import urllib3 import json测试数据 网页上的数据结构如下 {"success": true,"code": "CIFM_0000","encode": null,"message": &quo…

change buffer:到底应该选择普通索引还是唯一索引

文章目录 引言第一章&#xff1a;普通索引和唯一索引在查询逻辑与效率上的对比1.1 查询逻辑分析1.2 查询效率对比 第二章&#xff1a;普通索引和唯一索引在更新逻辑与效率上的对比2.1 更新逻辑分析2.2 更新效率对比 第三章&#xff1a;底层原理详解 - 普通索引和唯一索引的区别…

3D编辑器教程:如何实现3D模型多材质定制效果?

想要实现下图这样的产品DIY定制效果&#xff0c;该如何实现&#xff1f; 可以使用51建模网线上3D编辑器的材质替换功能&#xff0c;为产品3D模型每个部位添加多套材质贴图&#xff0c;从而让3D模型在展示时实现DIY定制效果。 具体操作流程如下&#xff1a; 第1步&#xff1a;上…

git入门环境搭建

git下载 git官网地址&#xff1a;https://git-scm.com/ 如果没有魔法的话&#xff0c;官网这个地址能卡死你 这里给个国内的git镜像链接 git历史版本镜像链接 然后一路next 默认路径 默认勾选就行。 今天就写到这吧&#xff0c;11点多了该睡了&#xff0c;&#xff0c;&#x…

Oracle ADB 导入 BANK_GRAPH 的学习数据

Oracle ADB 导入 BANK_GRAPH 的学习数据 1. 下载数据2. 导入数据运行 setconstraints.sql 1. 下载数据 访问 https://github.com/oracle-quickstart/oci-arch-graph/tree/main/terraform/scripts&#xff0c;下载&#xff0c; bank_accounts.csvbank_txns.csvsetconstraints.…

985研一学习日记 - 2024.11.14

一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、起床6:00 2、健身2h 3、LeetCode刷了题 动态规划概念 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的…

1.两数之和-力扣(LeetCode)

题目&#xff1a; 解题思路&#xff1a; 在解决这个问题之前&#xff0c;首先要明确两个点&#xff1a; 1、参数returnSize的含义是返回答案的大小&#xff08;数目&#xff09;&#xff0c;由于这里的需求是寻找数组中符合条件的两个数&#xff0c;那么当找到这两个数时&#…

【excel】easy excel如何导出动态列

动态也有多重含义&#xff1a;本文将描述两种动态场景下的解决方案 场景一&#xff1a;例如表头第一列固定为动物&#xff0c;且必定有第二列&#xff0c;第二列的表头可能为猫 也可能为狗&#xff1b;这是列数固定&#xff0c;列名不固定的场景&#xff1b; 场景二&#xff1…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列&#xff1a; 列名称&#xff0c;类型在后 n…

LlamaIndex

一、大语言模型开发框架 SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地开发基于大语言…

【FFmpeg】FFmpeg 函数简介 ③ ( 编解码相关函数 | FFmpeg 源码地址 | FFmpeg 解码器相关 结构体 和 函数 )

文章目录 一、FFmpeg 解码器简介1、解码流程分析2、FFmpeg 编解码器 本质3、FFmpeg 编解码器 ID 和 名称 二、FFmpeg 解码器相关 结构体 / 函数1、AVFormatContext 结构体2、avcodec_find_decoder 函数 - 根据 ID 查找 解码器3、avcodec_find_decoder_by_name 函数 - 根据 名称…

Linux——GPIO输入输出裸机实验

学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习&#xff0c;现在进行一下小结&#xff1a; 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…

zabbix搭建钉钉告警流程

目录 &#x1f324;️zabbix实验规划 &#x1f324;️zabbix实验步骤 &#x1f4d1;1 使用钉钉添加一个自定义的机器人 ​ &#x1f4d1;2在zabbix-server上编写钉钉信息发送脚本&#xff0c;设置钉钉报警媒介 ☁️ 设置钉钉报警媒介​编辑​编辑 ☁️在添加消息模板​编辑​…