策略模式-类型统计
文章目录
- 前言
- 一、策略模式是什么?
- 二、策略模式应用场景
- 三、策略模式优点
- 四、策略模式缺点
- 五、场景案例:类型统计
- 1.项目结构
- 2.UML图解
- 3.代码实现
- 3.1 指标枚举
- 3.2 请求体
- 3.3 响应体
- 3.4.分析统计指标策略
- 3.5.接口
- 3.6.扩展接口
- 3.7.接口实现
- 3.8.控制层
- 六、PostMan测试
- 1.测试getListData()接口
- 2.测试getChartData()接口
- 3.getObtainInventory()扩展接口
- 总结
前言
在做统计的业务开发中,常常伴随着用户选择不同类型的统计而动态的加载数据,返回的数据也会动态的改变,比如说一张商超里面可能有贩卖肉蛋禽、蔬菜、饮料、水果等,我们需要根据这几种类型指标(算法不同)去生成各自的统计数据,如果根据不同的类型写不同的接口,可以实简单现该功能,但带来的问题是接口定义太多,重复方法定义过多,如果统一一个接口、内容使用if去走分支,也可以实现相同的效果,但还是不够理想化,理想的是不需要手动的添加if分支,而是做到自动匹配到对应算法执行指定的流程,那么这时候就需要策略模式来帮我们实现这一步操作了
一、策略模式是什么?
- 策略模式是一种行为型设计模式,它定义了一系列算法或策略,并将它们封装起来,使它们可以互相替换。在使用策略模式时,可以通过改变不同的算法或策略来改变对象的行为。
- 策略模式通常包含两部分:策略接口和策略实现类。策略接口定义了对某种行为的抽象,而策略实现类则提供了具体的算法或策略实现。
二、策略模式应用场景
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
- 需要动态选择算法和策略时。
- 当一个对象需要通过多种行为方式中的一种进行某种操作时。
- 在不希望客户端知道具体实现细节的情况下,可采用策略模式对外提供接口。
- 多个类只有在算法或行为上稍有不同的场景。
- 假设有一个系统需要根据用户的不同操作系统显示不同的界面风格。可以使用策略模式,将不同操作系统的界面风格作为不同的策略实现类,并通过定义一个策略接口来对外暴露相应的方法。
- 策略模式还可以用于设计游戏中的战斗系统,根据不同角色的属性和职业特点,选取最优的战斗策略进行战斗。
总之,策略模式适用于多个类只有在算法或行为上稍有不同的场景,并且在运行时需要动态地选择不同的算法或策略的情况下。
三、策略模式优点
- 策略模式可以让算法或策略独立于使用它们的客户端而变化,从而实现代码复用。
- 策略模式可以让算法或策略在不影响代码结构的情况下灵活地变化,降低了代码维护的成本。
- 策略模式可以避免使用大量的 if-else 语句或者 switch 语句来进行分支处理,增强了代码的可读性和可维护性。
- 策略模式可以在运行时动态地改变算法或策略,因此可以根据需要进行适当的选择和组合。
四、策略模式缺点
- 策略模式会增加系统需要的类的数量,可能会导致代码变得更加复杂和难以理解。
- 策略模式需要客户端了解不同的策略之间的差异,增加了客户端的编码难度。
- 策略模式可能会导致不必要的运行时开销,因为需要动态地选择和组合算法或策略。
五、场景案例:类型统计
1.项目结构

2.UML图解

3.代码实现
3.1 指标枚举
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum StatisticalIndicatorsEnum {/*** 肉*/MEAT(1, "肉", "meatAnalysisTableService"),/*** 水果*/FRUIT(2, "水果", "fruitAnalysisTableService"),/*** 蔬菜*/VEGETABLE(3, "蔬菜", "vegetableAnalysisTableService"),/*** 饮料*/BEVERAGE(4, "饮料", "beverageAnalysisTableService");/*** 编码*/private final Integer code;/*** 注释*/private final String desc;/*** 对应策略*/private final String strategyName;
}
3.2 请求体
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mxf.code.strategy_factory.enums.StatisticalIndicatorsEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.bind.annotation.ModelAttribute;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;/*** 统计图Request*/
@Data
@ApiModel(value = "统计图Request")
public class StatisticsRequest implements Serializable {private static final long serialVersionUID = 1L;@NotBlank(message = "统计指标不能为空")@ApiModelProperty(value = "统计指标")private StatisticalIndicatorsEnum statisticalIndicatorsEnum;@NotNull(message = "统计起始时间不能为空")@ApiModelProperty(value = "开始时间,格式:yyyy-MM-dd")@JsonFormat(pattern = "yyyy-MM-dd")private Date startDate;@NotNull(message = "统计截止时间不能为空")@ApiModelProperty(value = "结束时间(格式:yyyy-MM-dd)")@JsonFormat(pattern = "yyyy-MM-dd")private Date endDate;@ModelAttribute("statisticalIndicators")public void setStatisticalIndicatorsEnum(StatisticalIndicatorsEnum statisticalIndicatorsEnum) {this.statisticalIndicatorsEnum = statisticalIndicatorsEnum;}
}
3.3 响应体
import lombok.Data;/*** @author mxf* @version 1.0* @description: 响应体Base* @date 2023/5/26*/
@Data
public abstract class BaseResponse {
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.math.BigDecimal;/*** @author 28382*/
@Data
@ApiModel(value = "蔬菜")
@EqualsAndHashCode(callSuper = true)
public class BeverageAvailabilityListResponse extends BaseResponse implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "统计时间")private String xDate;@ApiModelProperty(value = "饮料类型名称")private String beverageTypeName;@ApiModelProperty(value = "销售件数")private Double salesQuantity;@ApiModelProperty(value = "销售金额")private BigDecimal salesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.math.BigDecimal;/*** @author 28382*/
@Data
@ApiModel(value = "水果图表响应体")
@EqualsAndHashCode(callSuper = true)
public class FruitAvailabilityChartResponse extends BaseResponse implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "统计时间")private String xDate;@ApiModelProperty(value = "本年销售总额")private BigDecimal currentYearSalesAmount;@ApiModelProperty(value = "去年销售金额")private BigDecimal previousYearSalesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.math.BigDecimal;/*** @author 28382*/
@Data
@ApiModel(value = "水果")
@EqualsAndHashCode(callSuper = true)
public class FruitAvailabilityListResponse extends BaseResponse implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "统计时间")private String xDate;@ApiModelProperty(value = "肉类名")private String fruitTypeName;@ApiModelProperty(value = "销售量kg")private Double salesVolume;@ApiModelProperty(value = "销售金额")private BigDecimal salesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.math.BigDecimal;/*** @author 28382*/
@Data
@ApiModel(value = "肉")
@EqualsAndHashCode(callSuper = true)
public class MeatAvailabilityListResponse extends BaseResponse implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "统计时间")private String xDate;@ApiModelProperty(value = "肉类名")private String meatTypeName;@ApiModelProperty(value = "销售量kg")private Double salesVolume;@ApiModelProperty(value = "销售金额")private BigDecimal salesAmount;
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.math.BigDecimal;/*** @author 28382*/
@Data
@ApiModel(value = "蔬菜")
@EqualsAndHashCode(callSuper = true)
public class VegetableAvailabilityListResponse extends BaseResponse implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "统计时间")private String xDate;@ApiModelProperty(value = "肉类名")private String vegetableName;@ApiModelProperty(value = "销售量kg")private Double salesVolume;@ApiModelProperty(value = "销售金额")private BigDecimal salesAmount;
}
3.4.分析统计指标策略
管理策略bean
import com.mxf.code.strategy_factory.enums.StatisticalIndicatorsEnum;
import org.springframework.stereotype.Service;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 分析统计指标策略** @author 28382*/
@Service
public class AnalysisTableStrategyContext {private final Map<String, AnalysisTableService> analysisTableMap = new ConcurrentHashMap<>();public AnalysisTableStrategyContext(Map<String, AnalysisTableService> strategyMap) {this.analysisTableMap.putAll(strategyMap);}/*** @param statisticalIndicatorsEnum 指标枚举* @return com.mxf.code.strategy_factory.service.AnalysisTableService* @author mxf* @description 获取实际统计策略* @createTime 2023/5/26 14:08* @paramType [com.mxf.code.strategy_factory.enums.StatisticalIndicatorsEnum]*/public AnalysisTableService getResource(StatisticalIndicatorsEnum statisticalIndicatorsEnum) {return analysisTableMap.get(statisticalIndicatorsEnum.getStrategyName());}
}
3.5.接口
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;import java.util.List;/*** 统计分析*/
public interface AnalysisTableService {/*** 获取统计图数据** @param requestParams 入参* @return*/List<BaseResponse> getChartData(StatisticsRequest statisticsRequest);/*** 获取列表数据** @param requestParams 入参* @return*/List<BaseResponse> getListData(StatisticsRequest statisticsRequest);
}
3.6.扩展接口
import com.mxf.code.strategy_factory.request.StatisticsRequest;/*** @author mxf* @version 1.0* @description: 水果(自定义接口)* @date 2023/5/26*/
public interface FruitAnalysisTableService {/*** 获取水果库存** @param statisticsRequest 入参* @return*/Double getObtainInventory(StatisticsRequest statisticsRequest);
}
3.7.接口实现
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.BeverageAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author mxf* @version 1.0* @description: 饮料* @date 2023/5/26*/
@Service("beverageAnalysisTableService")
public class BeverageAnalysisTableServiceImpl implements AnalysisTableService {@Overridepublic List<BaseResponse> getChartData(StatisticsRequest requestParams) {return null;}@Overridepublic List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {List<BeverageAvailabilityListResponse> resultList = new ArrayList<>();BeverageAvailabilityListResponse beverageAvailabilityListResponse = new BeverageAvailabilityListResponse();beverageAvailabilityListResponse.setXDate("");beverageAvailabilityListResponse.setBeverageTypeName("");beverageAvailabilityListResponse.setSalesQuantity(0.0D);beverageAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));resultList.add(beverageAvailabilityListResponse);return new ArrayList<>(resultList);}
}
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.FruitAvailabilityChartResponse;
import com.mxf.code.strategy_factory.response.FruitAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import com.mxf.code.strategy_factory.service.FruitAnalysisTableService;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author mxf* @version 1.0* @description: 水果* @date 2023/5/26*/
@Service("fruitAnalysisTableService")
public class FruitAnalysisTableServiceImpl implements AnalysisTableService, FruitAnalysisTableService {@Overridepublic List<BaseResponse> getChartData(StatisticsRequest requestParams) {List<FruitAvailabilityChartResponse> resultList = new ArrayList<>();FruitAvailabilityChartResponse fruitAvailabilityChartResponse = new FruitAvailabilityChartResponse();fruitAvailabilityChartResponse.setXDate("2022-05-25");fruitAvailabilityChartResponse.setCurrentYearSalesAmount(new BigDecimal("4"));fruitAvailabilityChartResponse.setPreviousYearSalesAmount(new BigDecimal("5"));FruitAvailabilityChartResponse fruitAvailabilityChartResponse2 = new FruitAvailabilityChartResponse();fruitAvailabilityChartResponse2.setXDate("2022-05-26");fruitAvailabilityChartResponse2.setCurrentYearSalesAmount(new BigDecimal("1"));fruitAvailabilityChartResponse2.setPreviousYearSalesAmount(new BigDecimal("2"));resultList.add(fruitAvailabilityChartResponse);resultList.add(fruitAvailabilityChartResponse2);return new ArrayList<>(resultList);}@Overridepublic List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {List<FruitAvailabilityListResponse> resultList = new ArrayList<>();FruitAvailabilityListResponse fruitAvailabilityListResponse = new FruitAvailabilityListResponse();fruitAvailabilityListResponse.setXDate("");fruitAvailabilityListResponse.setFruitTypeName("");fruitAvailabilityListResponse.setSalesVolume(0.0D);fruitAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));resultList.add(fruitAvailabilityListResponse);return new ArrayList<>(resultList);}@Overridepublic Double getObtainInventory(StatisticsRequest statisticsRequest) {return 334423423.44;}
}
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.MeatAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author mxf* @version 1.0* @description: 肉* @date 2023/5/26*/
@Service("meatAnalysisTableService")
public class MeatAnalysisTableServiceImpl implements AnalysisTableService {@Overridepublic List<BaseResponse> getChartData(StatisticsRequest requestParams) {return null;}@Overridepublic List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {List<MeatAvailabilityListResponse> resultList = new ArrayList<>();MeatAvailabilityListResponse meatAvailabilityListResponse = new MeatAvailabilityListResponse();meatAvailabilityListResponse.setXDate("");meatAvailabilityListResponse.setMeatTypeName("");meatAvailabilityListResponse.setSalesVolume(0.0D);meatAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));resultList.add(meatAvailabilityListResponse);return new ArrayList<>(resultList);}
}
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.response.VegetableAvailabilityListResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author mxf* @version 1.0* @description: 蔬菜* @date 2023/5/26*/
@Service("vegetableAnalysisTableService")
public class VegetableAnalysisTableServiceImpl implements AnalysisTableService {@Overridepublic List<BaseResponse> getChartData(StatisticsRequest requestParams) {return null;}@Overridepublic List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {List<VegetableAvailabilityListResponse> resultList = new ArrayList<>();VegetableAvailabilityListResponse vegetableAvailabilityListResponse = new VegetableAvailabilityListResponse();vegetableAvailabilityListResponse.setXDate("");vegetableAvailabilityListResponse.setVegetableName("");vegetableAvailabilityListResponse.setSalesVolume(0.0D);vegetableAvailabilityListResponse.setSalesAmount(new BigDecimal("0"));resultList.add(vegetableAvailabilityListResponse);return new ArrayList<>(resultList);}
}
3.8.控制层
import com.mxf.code.strategy_factory.request.StatisticsRequest;
import com.mxf.code.strategy_factory.response.BaseResponse;
import com.mxf.code.strategy_factory.service.AnalysisTableService;
import com.mxf.code.strategy_factory.service.AnalysisTableStrategyContext;
import com.mxf.code.strategy_factory.service.FruitAnalysisTableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author mxf* @version 1.0* @description: 统计分析* @date 2023/5/26*/
@RestController
@RequestMapping("statistical/indicators")
public class StatisticalIndicatorsController {@Autowiredprivate AnalysisTableStrategyContext analysisTableStrategyContext;@Autowiredprivate FruitAnalysisTableService fruitAnalysisTableService;@GetMapping("listData")public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());Assert.notNull(resource, "未知策略");return resource.getListData(statisticsRequest);}@GetMapping("chartData")public List<BaseResponse> getchartData(StatisticsRequest statisticsRequest) {AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());Assert.notNull(resource, "未知策略");return resource.getChartData(statisticsRequest);}@GetMapping("getFruitObtainInventory")public Double getFruitObtainInventory(StatisticsRequest statisticsRequest) {return fruitAnalysisTableService.getObtainInventory(statisticsRequest);}
}
六、PostMan测试
1.测试getListData()接口
@GetMapping("listData")
public List<BaseResponse> getListData(StatisticsRequest statisticsRequest) {AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());Assert.notNull(resource, "未知策略");return resource.getListData(statisticsRequest);
}

2.测试getChartData()接口
@GetMapping("chartData")
public List<BaseResponse> getchartData(StatisticsRequest statisticsRequest) {AnalysisTableService resource = analysisTableStrategyContext.getResource(statisticsRequest.getStatisticalIndicatorsEnum());Assert.notNull(resource, "未知策略");return resource.getChartData(statisticsRequest);
}

3.getObtainInventory()扩展接口
@GetMapping("getFruitObtainInventory")public Double getFruitObtainInventory(StatisticsRequest statisticsRequest) {return fruitAnalysisTableService.getObtainInventory(statisticsRequest);}

总结
上述案例实现策略模式同时,针对入参、出参、接口扩展做了更好的兼容。
相关文章:
策略模式-类型统计
文章目录 前言一、策略模式是什么?二、策略模式应用场景三、策略模式优点四、策略模式缺点五、场景案例:类型统计1.项目结构2.UML图解3.代码实现3.1 指标枚举3.2 请求体3.3 响应体3.4.分析统计指标策略3.5.接口3.6.扩展接口3.7.接口实现3.8.控制层 六、P…...
android 12.0app应用安装白名单
1.概述 在12.0定制化开发中,客户需求要实现应用安装白名单功能,在白名单之中的应用可以安装,其他的app不准安装,实现一个 控制app安装的功能,这需要从app安装流程入手就可以实现功能 PMS就是负责管理app安装的,功能就添加在这里就可以了, 2.app应用安装白名单核心代码 …...
android 12.0Launcher3禁止拖动图标到Hotseat
1.概述 在12.0系统Launcher3进行定制化开发中,对于hotseat的开发中,由功能需求要求禁止拖动图标到Hotseat的功能,而拖拽也是在workspace.java中处理的 接下来就从workspace.java 开始找解决的办法 2.Launcher3禁止拖动图标到Hotseat相关代码分析 packages/apps/Launcher3…...
Java阶段三Day03
Java阶段三Day03 文章目录 Java阶段三Day03JavaScript语言JavaScript概述什么是JavaScript语言特点一门编程语言包括哪些内容 语言基础变量JavaScript常用数据类型运算符各种语句如何在HTML页面中引入JavaScript代码方法和页面相关的方法 BOM和DOM什么是BOMwindow对象location对…...
【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第七届
文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.h:main.h:main.h: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置,直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…...
Java日期时间调整的几种方式
一、Calendar类 我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。 Calendar类的…...
如何在Windows 11更新后解决C盘已满的问题?
Windows 11比Windows 10需要占用C盘更多的空间,在升级到Windows 11后,如果升级后出现问题,安装程序可以帮你退回到Windows 10。无论怎样,在升级到Windows 11后,系统会自动制作以前的数据的副本,这会占用大量…...
DJ6-1/2/3 文件系统
目录 6.1 文件系统概述 6.1.1 文件、记录和数据项 6.1.2 文件类型 6.1.3 文件系统模型 6.1.4 对文件的操作 6.2 文件的逻辑结构 6.2.1 文件逻辑结构的类型 6.2.2 顺序文件(Sequential File) 6.2.4 索引文件(Index File&…...
华为OD机试真题 Java 实现【打印文件】【2023Q1 100分】
一、题目描述 有 5 台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如果存在两个优先级一样的文件,则选…...
基于LSB实现文本、图片、压缩包的隐藏
关于LSB的相关介绍: LSB全称为 Least Significant Bit(最低有效位),是一种基于图片最低有效位修改储存信息的隐写方法,在CTF杂项中经常会遇到,LSB属于空域算法中的一种,是将信息嵌入到图像点中…...
(万字长文)Linux——IO之重定向+缓冲区 +重定向 +缓冲区原理实现 +带重定向的简易版shell+标准输出标准错误
索引 文件描述符分配规则重定向 缓冲区1.什么是缓冲区2.缓冲区在哪里 重定向源码模拟实现缓冲区原理带重定向的简易版Xshell标准输入和标准错误 文件描述符分配规则 文件描述符的分配规则 从头遍历数组fd_array[],找到一个最小的,没有被使用的下标,分配…...
面试:js 延迟加载方式
相关知识点: js 延迟加载,也就是等页面加载完成之后再加载 JavaScript 文件。 js 延迟加载有助于提高页面加载速度 一般有以下几种方式: defer 属性 async 属性 动态创建 DOM 方式 使用 setTimeout 延迟方法 让 JS 最后加载 js 的加载…...
将Oracle数据文件导入SQL Server的方法
审计过程中,采集的业务数据有Oracle备份数据,备份文件的后缀名为.dmp。如何将*.dmp文件导入审计人员熟悉的SQL Server中呢?以下是现场审计数据导入方法介绍。 一、将*.dmp文件导入oracle数据库 *.dmp文件为Oracle数据库备份文件,因…...
《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序
《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序 题目1题目2题目3题目4题目5题目6总结 题目1 将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题 assume cs:code, ds:data, ss:stack data segmentdw 0123h,0456h,0789h,0abch,0def…...
剑指offer -- 二维数组中的查找
二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 暴力查找法: 是一种简单直接的解决方法,可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素,逐个与目标值进行比较。 具体步骤如下: 从数组的第一行第一列开始,…...
3. 自然语言处理NLP:具体用途(近义词类比词;情感分类;机器翻译)
一、求近义词和类比词 1. 近义词 方法一:在嵌入模型后,可以根据两个词向量的余弦相似度表示词与词之间在语义上的相似度。 方法二:KNN(K近邻) 2. 类比词 使用预训练词向量求词与词之间的类比关系。eg:man&a…...
Hibernate的FlushMode
一、Session中FlushMode的设置: 在事务开启前设置FlushMode属性,方法: // session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)。Service public class TestService {Logger log LoggerFactory.getLogger(getClass());AutowiredEntityM…...
二线程序员的出路
最近长沙不太平。去年被动离职一拨人之后,HR一直强调降本增效,人人自危,挤走一拨人,反正会有大量内卷失败的一线程序员进来填坑。当然留就有人走,前同事除了几个出去搞培训创业(后面解散了)的之…...
MKS SERVO4257D 闭环步进电机_系列2 菜单说明
第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈&am…...
使用Actor-Critic的DDPG强化学习算法控制双关节机械臂
在本文中,我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂,这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置,所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
