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

策略模式(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.rhkb.cn/news/313336.html

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

相关文章

动手学大模型应用开发--Chapter 01 大模型概念

文章目录 前言一、学习知识点概要1.1 LLM1.3 ChatGPT1.3 RAG1.3.1 RAG解决的问题1.3.2 RAG的主要流程&#xff1a; 1.4 LangChain 前言 本学习笔记为datawhale动手学大模型应用开发的学习内容&#xff0c;学习链接为&#xff1a; https://datawhalechina.github.io/llm-univer…

计算机视觉实验五——图像分割

计算机视觉实验五——图像分割 一、实验目标二、实验内容1.了解图割操作&#xff0c;实现用户交互式分割&#xff0c;通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域&#xff0c;实现分割①图片准备②代码③运行结果④代码说明 2.采用聚类法实现…

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

小型CNC数控机床深受到韩国客户青睐

随着公司的快速发展&#xff0c;育菁科研成果的不断突破和自主创新能力的提高&#xff0c;育菁小型CNC机床迎合了国际化大市场的需求&#xff0c;吸引了众多国外客户的眼球&#xff0c;近日&#xff0c;韩国客户工程师和CEO到我司进行实地考察交流 在胡经理和外贸同事陪同下&am…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification&#xff08;Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung&#xff09;【WSDM 2021】 2 Co…

哪个品牌蓝牙耳机好?掌握六大选购逻辑,选准不选贵!

​随着科技的不断进步&#xff0c;蓝牙耳机已经成为了我们生活中不可或缺的一部分。它不仅摆脱了有线的束缚&#xff0c;还提供了极大的自由度。然而&#xff0c;面对市场上琳琅满目的蓝牙耳机&#xff0c;挑选一款性价比高的产品确实需要一些技巧。作为一名资深的耳机用户&…

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日&#xff0c;为推进采购阳光化、数字化和智能化&#xff0c;提升管理效率与质量&#xff0c;企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司&#xff08;以下简称“健力宝”&#xff09;成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

论文解读:(CoOp)Learning to Prompt for Vision-Language Models

文章汇总 存在的问题 虽然训练类别通常具有文本形式&#xff0c;例如“金鱼”或“卫生纸”&#xff0c;但它们将被转换为离散标签&#xff0c;只是为了简化交叉熵损失的计算&#xff0c;从而使文本中的语义封装在很大程度上未被利用。这样的学习范式将视觉识别系统限制在闭集…

代码随想录阅读笔记-回溯【N皇后】

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和 . 分别代表…

Java垃圾回收2

垃圾回收的算法有哪些 通过可达性分析算法&#xff0c;我们已经可以找到需要回收的对象。现在需要通过垃圾回收算法&#xff0c;把垃圾回收&#xff0c;释放内存。 1.标记清除算法(使用较少) 标记清除算法&#xff0c;是将垃圾回收分为2个阶段&#xff0c;分别是标记和清除。…

FreeRTOS任务管理

1. 任务状态理论讲解 定时器职中断周期此处的1000Hz表示的是没次间隔1毫秒就记一次数&#xff08;在FreeConfig.h&#xff09;文件中进行配置 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 判断是否需要任务切换在FreeRTOS里面每次间隔1毫秒切换一次&#xff08;程序…

【iOS开发】(二)react Native基础语法+样式+布局20240417

【IOS开发】 前言&#xff1a;&#xff08;一&#xff09;我们已经搭建好了基础环境&#xff0c;和iOS环境&#xff0c;并创建和在模拟器上成功运行了一个app&#xff0c;mywdm。 目录标题 一&#xff0c; 如何进行模拟器调试二&#xff0c;基础语法&#xff1a;1 掌握reactjs…

网站创建的流程是什么

网站的创建过程包括几个主要的步骤&#xff0c;其中涉及到一系列的决策和实践操作。下面我将详细介绍网站创建的流程&#xff0c;帮助读者了解如何创建一个成功的网站。 第一步&#xff1a;确定网站目标和功能 在创建网站之前&#xff0c;你需要明确自己网站的目标和功能。是用…

AT32F415CBT7 封装LQFP-48 单片机微控制器IC芯片

ARM Cortex-M4 内核&#xff1a;AT32F415CBT7 采用 32 位 ARM Cortex-M4 内核&#xff0c;工作频率高达 200 MHz&#xff0c;具有较高的处理能力和响应速度。 大容量闪存存储器&#xff1a;该单片机内置 256KB 的闪存存储器&#xff08;Flash&#xff09;&#xff0c;可以存储…

Hadoop中的MapReduce流程(图解)

一、MapReduce流程图&#xff1a; 二、MapReduce流程步骤&#xff1a; 1.文件上传到HDFS中&#xff0c;默认以128M切分为一个block块 2.每个block块对数据进行逻辑上的切片&#xff0c;切片大小为128M,与block块大小一致 3.之后根据切片产生Map任务 4.Map任务会进入环形缓冲区&…

Linux 操作系统指令和Vscdoe安装

1、Linux系统介绍 Linux系统的背景介绍我就不介绍了&#xff0c;有兴趣的可以去看看其发展史。 1.1 Linux操作系统的主要特点 Linux操作系统的重要思想&#xff1a;一切皆文件 Linux操作系统的特性&#xff1a; 完全免费 支持多平台 支持多用户、多任务 有良好的界面 完美兼容…

引导过程与故障修复

一、Linux操作系统引导过程 1、引导过程总览 开机自检 检查硬件设备&#xff0c;检测出第一个能够引导系统的设备&#xff0c;比如硬盘或者光驱 MBR 引导 运行MBR扇区里的主引导程序GRUB 启动GRUB菜单 统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和位置&#xf…

如何进行数据库的迁移与同步——【DBA 从入门到实践】第四期

在日常的数据库运维工作中&#xff0c;我们时常会面临数据库替换、机房搬迁、业务测试以及数据库升级等任务&#xff0c;这些任务都需要对数据进行迁移和同步操作。【DBA 从入门到实践】第4期&#xff0c;将引导大家深入了解数据库迁移的流程&#xff0c;并探讨在迁移过程中可用…

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

Django第三方功能的使用

Django第三方功能的使用 Django REST framework前言1、Django--Restframework--coreapi版文档BUG:AssertionError: coreapi must be installed for schema support.How to run Django with Uvicorn webserver?2、序列化类 Serializer的使用模型序列化类 ModelSerializer的使用…