设计模式胡咧咧之策略工厂实现导入导出

策略模式(Strategy Pattern)

定义:

定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。

本质:

分离算法,选择实现

应用场景

何时使用

一个系统有许多类,而区分他们的只是他们直接的行为时

优点

开闭原则
避免使用多重条件判断
扩展性良好,增加一个策略只需要实现接口即可

缺点

策略类数量会增多,复用可能性很小
所有策略类都需要对外暴露

场景

多个类,只有算法或行为上稍有不同的场景
算法需要自由切换的场景
需要屏蔽算法规则

实例举例

导入导出
出行方式:自行车、汽车等,每一种出行方式都是一个策略
商场促销方式,打折、满减等
Java LayoutManager 布局管理器

策略模式实现导入/导出

背景:最近在做excle的导入导出,大概10个导出,3个导入。共用的同一个记录表。思来想去用策略+简单工厂模式去除if else if …,以便更好的拓展和维护。
1.定义一个导入接口:
在这里插入图片描述2.创建一个策略工厂:

	@Resourceprivate Map<String, TaskExportHandleService> taskHandleServiceMap;

3.策略枚举:

@Getter
public enum TaskTypeEnum {/*** 任务类型枚举*/DAILY(1, "日常检查"),SPECIAL(2, "专项检查"),ENTERPRISE(3, "企业自查"),;private final Integer code;private final String desc;TaskTypeEnum(int code, String desc) {this.code = code;this.desc = desc;}public static TaskTypeEnum toEnum(int id) {return Arrays.stream(values()).filter(area -> area.getCode().equals(id)).findFirst().orElse(null);}
}

4.实现接口:

@Service("ENTERPRISE")
@Slf4j
public class EnterpriseTaskExportHandleServiceImpl implements TaskExportHandleService {@Overridepublic Long saveRecord(Map<String, Object> paramMap, String operator) {log.info("------------------------");log.info("执行任务:{}", TaskTypeEnum.ENTERPRISE.getDesc());log.info("保存记录文件,状态置为处理中");return 0L;}@Async("TaskExport")@Overridepublic void exportFile(Map<String, Object> paramMap, Long recordId, EpUser currentUser) {log.info("异步处理导出文件ing");log.info("更新到文件记录ing");log.info("------------------------");}
}@Service("DAILY")
@Slf4j
public class DailyTaskExportHandleServiceImpl implements TaskExportHandleService {@Overridepublic Long saveRecord(Map<String, Object> paramMap, String operator) {log.info("------------------------");log.info("执行任务:{}", TaskTypeEnum.DAILY.getDesc());log.info("保存记录文件,状态置为处理中");return 0L;}@Async("TaskExport")@Overridepublic void exportFile(Map<String, Object> paramMap, Long recordId, EpUser currentUser) {log.info("异步处理导出文件ing");log.info("更新到文件记录ing");log.info("------------------------");}
}@Service("SPECIAL")
@Slf4j
public class SpecialTaskExportHandleServiceImpl implements TaskExportHandleService {@Overridepublic Long saveRecord(Map<String, Object> paramMap, String operator) {log.info("------------------------");log.info("执行任务:{}", TaskTypeEnum.SPECIAL.getDesc());log.info("保存记录文件,状态置为处理中");return 0L;}@Async("TaskExport")@Overridepublic void exportFile(Map<String, Object> paramMap, Long recordId, EpUser currentUser) {log.info("异步处理导出文件ing");log.info("更新到文件记录ing");log.info("------------------------");}
}

5.1controller 实现:

@RestController
@RequestMapping("/demo")
//@RequiredArgsConstructor 需要final
@AllArgsConstructor
@Anonymous
@Slf4j
public class TaskController {private final List<TaskExportHandler> exportHandlers;private final DefaultExportHandler defaultExportHandler;@PostMapping("/export")public Result<String> list(@RequestBody TaskExportReq req) {exportHandlers.stream().filter(fileHandler ->fileHandler.support(req.getBusinessType())).findFirst().orElse(defaultExportHandler).exportFile(req.getBusinessType(),new EpUser(), req.getParamMap());return Result.success(null);}
}

5.2导出文件req

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("导出文件req")
public class TaskExportReq {@ApiModelProperty(value = "操作类型枚举 TaskTypeEnum")private Integer businessType;@ApiModelProperty(value = "查询参数")private Map<String, Object> paramMap;}

6.1方便维护,编写任务导出Handler

@Component
public abstract class TaskExportHandler {@Resourceprivate Map<String, TaskExportHandleService> taskHandleServiceMap;public void exportFile(Integer businessType, EpUser currentUser, Map<String, Object> paramMap) {// 匹配处理器TaskExportHandleService taskExportHandleService = matchExportService(businessType);// 保存记录-调用保存文件Long recordId = taskExportHandleService.saveRecord(paramMap, currentUser.getName());// 异步执行导出taskExportHandleService.exportFile(paramMap, recordId, currentUser);}/*** 匹配业务类型对应的导出处理器*/private TaskExportHandleService matchExportService(Integer businessType) {TaskTypeEnum businessTypeEnum = TaskTypeEnum.toEnum(businessType);if (Objects.isNull(businessTypeEnum) || Objects.isNull(taskHandleServiceMap.get(businessTypeEnum.name()))) {throw new ServiceException("不支持的文件操作类型");}return taskHandleServiceMap.get(businessTypeEnum.name());}public Boolean support(Integer businessType) {return Boolean.FALSE;}
}

6.2默认任务Handler

@Component
public class DefaultExportHandler extends TaskExportHandler {}

7运行效果:
在这里插入图片描述

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

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

相关文章

Ubuntu22.04.4 - MySQL8 - 笔记

MySQL8在Ubuntu22.04.4环境下的笔记 一、安装 sudo apt update sudo apt install mysql-server sudo systemctl status mysql 二、卸载 sudo apt remove --purge mysql-* sudo apt autoremove dpkg --list | grep mysql查询是否还存在相关的依赖组件 dpkg -l |grep ^rc|awk {p…

复合机器人在磁钢上下料中的应用及其优势分析

复合机器人是一种集成了移动机器人和工业机器人功能的设备&#xff0c;其独特之处在于拥有“手、脚、眼、脑”的综合能力&#xff0c;从而实现了更高的灵活性和操作效率。在磁钢上下料的应用场景中&#xff0c;复合机器人能够发挥显著的优势。 首先&#xff0c;复合机器人可以根…

Photomator 3.3.5 (macOS Universal) - 照片编辑软件

Photomator 3.3.5 (macOS Universal) - 照片编辑软件 适用于 Mac、iPhone 和 iPad 的终极照片编辑器 请访问原文链接&#xff1a;https://sysin.org/blog/photomator/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Photomat…

Nodejs 第六十五章(SDL单设备登录)

单设备登录 SDL&#xff08;Single Device Login&#xff09;是一种单设备登录的机制&#xff0c;它允许用户在同一时间只能在一个设备上登录&#xff0c;当用户在其他设备上登录时&#xff0c;之前登录的设备会被挤下线。 应用场景 视频影音&#xff0c;防止一个账号共享&a…

关于项目中加入线程池,导致JVM性能急剧下降的问题

在项目中&#xff0c;为了提高新系统服务的并发处理能力&#xff0c;我在项目中加入了线程池。 由于原来的项目是单线程的一个服务&#xff0c;或者说是一个少线程的服务. 所以公司前辈&#xff0c;将jvm的TLAB 参数配置进行关闭了。 TLAB&#xff08;Thread Local Allocation …

计算机网络 -- 网络编程基础

一 学习准备 1.1 IP地址 在 前文中我们提到过: IP 是全球网络的基础&#xff0c;使用 IP 地址来标识公网环境下主机的唯一性&#xff0c;我们可以根据 目的IP地址 进行跨路由器的远端通信。 但是我们也提到了&#xff0c;通过 IP 地址&#xff0c;只能寻找到目标主机&#xff…

视频质量度量VQM算法详细介绍

视频质量评价 视频质量评价(Video Quality Assessment,VQA)是指通过主观、客观的方式对视频图像的内容、画质等,进行感知、衡量与评价。 ITU definations subjective assessment: the determination of the quality or impairment of programme-like pictures presented…

MASA Framework-原理分析(6)

MASA Framework的原理分析主要涉及到其核心组件、架构设计和运行机制等多个方面。以下是对MASA Framework原理的深入解析&#xff1a; 1. 核心组件与功能 MASA Framework的核心组件包括服务容器、数据存储、消息队列以及监控和管理工具等。这些组件共同协作&#xff0c;为开发…

桌面应用框架概论

目录 桌面应用框架概论 1.介绍 2.优缺点 3.总结 桌面应用框架概论 1.介绍 桌面应用框架种类繁多,以下是一些主要的框架: Electron:这是一个用于创建跨平台桌面应用的开源框架。它允许开发者使用Web技术(HTML、CSS和JavaScript)来构建桌面应用程序,使得桌面应用的开…

字符串的一些有趣案例

文章目录 简介删除文本中的括号和其中的文本 简介 分享python 字符串操作的一些有趣的案例&#xff1a; 正则表达式format … 删除文本中的括号和其中的文本 存在中英文括号混用&#xff0c;故要考虑到所有可能到情况 import re def remove_all_parentheses(text): # 正…

MongoDB聚合运算符:$replaceOne

MongoDB聚合运算符&#xff1a;$replaceOne 文章目录 MongoDB聚合运算符&#xff1a;$replaceOne语法参数字段说明 使用$replaceOne 与 Null$replaceOne 和排序规则$replaceOne 和 Unicode 规范化 举例 $replaceOne聚合运算在输入的字符串中搜索目标字符串&#xff0c;并使用指…

【代码随想录】【动态规划】day48:打家劫舍

打家劫舍1 def rob(self, nums):""":type nums: List[int]:rtype: int"""# 分为两个情况&#xff0c;偷还是不偷&#xff0c;# dp[i]为考虑到第i个房间时的最大值if len(nums) 0: # 如果没有房屋&#xff0c;返回0return 0if len(nums) 1: #…

【 书生·浦语大模型实战营】作业(五):LMDeploy 量化部署

【 书生浦语大模型实战营】作业&#xff08;五&#xff09;&#xff1a;LMDeploy 量化部署 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系…

Linux debian gdb dump

1.开发背景 记录 debian 下应用程序崩溃调试方法 2.开发需求 程序越界可以定位到越界的位置附近 3.开发环境 debian 操作系统&#xff0c;如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 设置 dump 输出大小 ulimit -c unlimited # 设置输出大小 生成core 文…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入&#xff1a; INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

Linux下SPI设备驱动实验:使用内核提供的读写SPI设备中的数据的函数

一. 简介 前面文章的学习&#xff0c;已经实现了 读写SPI设备中数据的功能。文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;验证读写SPI设备中数据的函数功能-CSDN博客 本文来使用内核提供的读写SPI设备中的数据的API函数&#xff0c;来实现读写SPI设备中数据。 …

JSON文件初识

JSON&#xff08;JavaScript Object Notation&#xff09;是一种用于存储和交换数据的轻量级数据格式。它独立于任何编程语言&#xff0c;因此可以在各种语言环境中使用&#xff0c;包括网页、服务器、应用程序等。JSON的简洁性、可读性以及易于解析的特性&#xff0c;使其在网…

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…

MySQL 8.0 新特性之 Clone Plugin

个人感觉&#xff0c;主要还是为 Group Replication 服务。在 Group Replication 中&#xff0c;如果要添加一个新的节点&#xff0c;这个节点差异数据的补齐是通过分布式恢复&#xff08; Distributed Recovery &#xff09;来实现的。 在 MySQL 8.0.17 之前&#xff0c;只支…

【数据结构】队列(链表模拟队列)

学习本章节必须具备 单链表的前置知识&#xff0c; 建议提前学习&#xff1a;点击链接学习&#xff1a;单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff…