使用策略模式+工厂模式干掉代码中过多的if-else

用设计模式消除大量if-else 前言 先来看张经典的啊都给神图,感受下大量if-else的“魅力” 有时候业务上的拖拉可能要求我去写出如上的多层if-else嵌套代码,如果你碰上了一个对团队成员要求相对比较严格的主管的话,那么恭喜你,死定了……脾气比较爆的大佬可能直接就跟你说要么解决上面问题,要么收拾包袱滚蛋了。 那上述代码能否用设计模式相关解决呢,答案是:YES,可以用策略模式+工厂模式。 限于本文篇幅,上述的两种... 阅读详情

过多if-else项目背景

如果一开始就知道现在的业务需要,大部分人都不会在代码里添加过多的if-else判断的,烂代码基本都是刚开始写代码时并没有太多的需求,随着期需求不断的修改增加,开发时间也较的紧张,代码往往都是怎么快速怎么写。当然多写一个if-else比使用各种设计模式肯定来的更快速了,这也就导致项目代码慢慢变得臃肿,难以维护的主要原因。在有空闲时间的情况下就可以给以前的代码做一次手术了。先看本次未优化前的代码:

@Override
public MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType) {
	MMediaInfo mMediaInfo = new MMediaInfo();
	LibTypeEnum libTypeEnum = LibTypeEnum.valueof(libType);
	if (libTypeEnum.getFileType().equals(FileType.VIDEO)) {
		mMediaInfo = mvideoInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
	}
	if (libTypeEnum.getFileType().equals(FileType.AUDIO)) {
		mMediaInfo = mAudioInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
	}
	if (libTypeEnum.getFileType().equals(FileType.PICTURE)) {
		mMediaInfo = mImgInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
	}
	if (libTypeEnum.getFileType().equals(FileType.FILE)) {
		mMediaInfo= mFileInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
	}
	return mMediaInfo;
}

之所有会有些段代码,主要原因是项目前期,需求中只有 视频/音频的 ,并且音频操作接口,逻辑都是分开的,后面又增加了图片/文件需求,并且要求视频/音频/文件/图片 能合并在同一接口处理, 这就导致了代码中很多操作有大量 if-else判断
再看优化后的代码:

@Override
public MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType) {
	LibTypeEnum libTypeEnum = LibTypeEnum.valueof(libType);
    IFileService iFileService = FileFactory.getFileService(libTypeEnum.getFileType());
    return   iFileService.copyToLibType(userQiniuDTO, mediaId, libType);
}

此断代码看起来就清爽多了,实现的基本思路就是使用了 策略模式+工厂模式,代码通过不同的文件类型返回对应的实现类来实现复制逻辑

基本视频步骤

  1. 创建IFileService接口
public interface IFileService {
    Integer getFileType();
    MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType);
}
  1. 视频/音频/图片/文件类分别视频IFileService接口
public class MVideoInfoServiceImpl extends ServiceImpl<MvideoInfoMapper, MvideoInfo> implements MvideoInfoService, IFileService {
    
    @Override
    public Integer getFileType() {
        return FileType.VIDEO;
    }
    @Override
    public MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long id, Integer libType) {
 		//复制视频逻辑
 		
        return mMediaInfo;
    }
}
  1. 创建FileFactory工厂类
@Component
public class FileFactory implements ApplicationContextAware {
 
    private static Map<Integer, IFileService> fileServiceMap;
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, IFileService> map = applicationContext.getBeansOfType(IFileService.class);
        fileServiceMap = new HashMap<>();
        map.forEach((key, value) -> fileServiceMap.put(value.getFileType(), value));
    }
 
    public static <T extends IFileService> T getFileService(Integer fileType) {
        return (T)fileServiceMap.get(fileType);
    }
 
}

总结

copyToLibType只是优化的一个方式,IFileService中还有很多 如 移动/删除 等操作的代码也可以干掉过多的if-else了。

干掉 if-else -- 策略模式和工厂模式 策略模式(Strategy Pattern),指的是定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化。策略模式将各个策略独立成单独的类工厂模式通过一个map真正的将 if-else 逻辑干掉Spring 的实现策略类在初始化时,自动将自己注册进策略工厂。 阅读详情

相关推荐

java策略模式去掉冗余if-else实战支付案例

java策略模式去掉冗余if-else支付案例实战 前言 上一篇文章介绍了 java中冗余if-else代码块的优化(策略模式法,反射法) ,里面详细介绍了策略模式+工厂模式来解决代码中大量的if-else结构。 这一篇就举个实战例来说明,怎么使用策略模式。 1.支付案例需求 假设你在做的某个项目,需求就是页面选择不同的付款渠道,计算不同的折扣,进行扣款。 看到这个图片,有小伙伴在遇到诸如此类的...

空空说技术的博客 2226

业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!

对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过...

weixin_43167418的博客 2348

使用策略模式代替嵌套的多层if-else

– 后台在开发的过程中,需要进行各种逻辑判断,来判断某个按钮是否展示,某个操作是否允许。 所以嵌套了很多if-else判断,看起来很是头痛。修改了起来也要各方面考虑,防止逻辑错误,进行影响。 如图: 之前一直不知道会有怎样的处理方式更好。 先简介一下,这戏需要进行的逻辑判断: 判断当前用户是否有权限 判断用户状态, 判断时间等 其他 判断此条信息状态是否允许这个操作 此条信息其他信...

zhiranyouni的博客 1682

【策略工厂模式】使用策略工厂模式解决if else过多的问题

使用策略工厂模式解决if else 过多的问题

zfxgf123456789的博客 1126

策略模式消除if-else分支判断.zip

使用策略模式和工厂模式彻底消除if-else分支

QGC二次开发实战指南(一):从零构建自定义地面站界面

本文详细介绍了QGC二次开发实战指南,从零开始构建自定义地面站界面。通过QT和QML技术结合MAVLINK协议,开发者可以打造适合特定业务场景的无人机监控系统,提升操作效率与用户体验。文章包含环境搭建、界面设计、数据绑定等完整开发流程,是QGC二次开发的实用教程。

weixin_28693683的博客 496

【日常业务开发】策略+工厂模式优化 if...else判断逻辑

此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用。业务中经常有支付业务,项目刚开始所有业务使用支付宝支付,后面湖南地区需要使用微信支付,然后湖北又需要使用易宝支付,后期可能还有扩展。工厂类PayFactory,暴露注册bean到工厂容器Map对象方法,提供根据type类型查询bean的静态方法。Key为bean的名称、value为IPay接口对应的bean实现类。对应的业务类型不好扩展。

输入技术、输出想法 1333

ArcGIS+PLUS+InVEST三件套实战:从零搞定土地利用变化与碳储量预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建土地利用变化与碳储量预测的完整研究流水线。通过多情景模拟和生态系统服务评估,提供从数据准备到结果验证的实战指南,助力研究者高效完成生态评估项目。

weixin_30399821的博客 545

【设计模式实战】用三种设计模式去优化if-else屎山代码!!!

我们之前也学习了不少设计模式,今天给大家介绍一个案例,帮助大家更加熟悉设计模式,并能够在自己写项目的时候能够下意识的使用设计模式,避免写出屎山代码。🌈。

小杰不秃头的博客 2352

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 605

Allegro快速编辑丝印文字操作指导

选择setup-Application Mode-placement edit。Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下。这个功能还支持拷贝粘贴,可以从其它地方拷贝过来,免去了书写的麻烦。出现text edit窗口,输入自己需要的文字,点击ok。鼠标移动到丝印文字位置,文字会被高亮起来。Allegro快速编辑丝印文字操作指导。点击丝印文字,丝印会被高亮起来。选择Text edit 命令。输入需要更改后的文字,如下。右击选择text edit。以编辑下方丝印文字为例。

weixin_54787054的博客 4193

阿里面试官:使用策略模式+工厂模式干掉代码中过多的if-else

过多if-else项目背景如果一开始就知道现在的业务需要,大部分人都不会在代码里添加过多的if-else判断的,烂代码基本都是刚开始写代码时并没有太多的需求,随着期需求不断的修改增加,开发时间也较的紧张,代码往往都是怎么快速怎么写。当然多写一个if-else比使用各种设计模式肯定来的更快速了,这也就导致项目代码慢慢变得臃肿,难以维护的主要原因。在有空闲时间的情况下就可以给以前的代码做一次手术了。先看本次未优化前的代码:}

m0_63437643的博客 146

RICHARDSON-LUCY 去卷积简介

Lucy去卷积1.泊松过程及联合概率分布2.极大似然估计参考文献 1.泊松过程及联合概率分布 首先假设相机接收光子生成图像的过程符合泊松分布。 因此,一次曝光过程中,某像素位置接收到iii个光子的概率p(i)p(i)p(i)为: p(i)=exp⁡(−λ)⋅λii!\qquad\qquad p(i)=\exp(-\lambda)\cdot\cfrac{\lambda^{i}}{i!}p(i)=exp(−λ)⋅i!λi​ 那么针对一张M∗NM*NM∗N的图像,所有像素的联合概率分布可以描述为: P(I)=∏e

驽马十驾,功在不舍;锲而不舍,金石可镂。 8695

阿里面试官:使用策略模式+工厂模式干掉代码中过多的if-else!

copyToLibType只是优化的一个方式,IFileService中还有很多 如 移动/删除 等操作的代码也可以干掉过多的if-else了。

mf97532的博客 284

《QEMU/KVM源码分析与应用》读书笔记1 —— 第1章 QEMU与KVM概述

《QEMU/KVM源码分析与应用》学习笔记1 —— 第一章 QEMU与KVM概述

phmatthaus的专栏 1985

Xilinx差分原语-IBUFGDS与OBUFGDS FPGA

它将差分信号转换为单端信号,并将其输入到FPGA的逻辑片上。它将单端信号转换为差分信号,并将其输出到FPGA的引脚。在FPGA设计中,差分信号是一种常见的信号传输方式,用于提高抗噪性和抑制共模噪声。Xilinx是一家知名的FPGA供应商,提供了许多差分原语,其中包括IBUFGDS和OBUFGDS。通过使用Xilinx的差分原语,如IBUFGDS和OBUFGDS,可以实现差分信号的输入和输出。这些差分原语提供了方便且可靠的接口,使得在FPGA设计中处理差分信号变得更加简单和高效。是差分输入信号的端口,

git_database727的博客 2096

代码中如何干掉太多的if else即if else的多种替代方案以提高代码质量通过公司代码审查

if...else控制语句,如果代码里滥用会大大降低代码的可读性、可维护性、可扩展性以及灵活性,进而使整个软件系统造成危害。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷,因此违反了违反单一职责原则和开闭原则,而且有些公司的代码审查会通不过。所以,if else的替代方案是很有必要的,如位语句,枚举,工厂模式,策略模式,状态模式等等

qq_41889508的博客 5万+

文末含资料链接和视频讲解!YOLOv8+RepVGG+QueryDet小目标检测终极指南:从理论到实战,突破遥感图像检测难题

QueryDet(Query Detection)机制代表了目标检测领域的一个重要范式转变。传统的目标检测方法基于anchor或anchor-free的密集预测,需要为图像中的每个可能位置生成预测。而QueryDet采用了稀疏查询的方式,通过少量的可学习查询向量来直接预测目标。 这种设计灵感来源于Transformer架构中的注意力机制。在自然语言处理中,Transformer通过query-key-value机制实现了高效的序列建模。QueryDet将这一思想引入到目标检测中,将检测问题转化为查询匹配问

FJN110的博客 387

避免过多if - else的新姿势:策略模式、工厂 + 策略

目录 前言 需求 编码实现 思考 策略模式 什么是策略模式? 编码 深思 工厂 + 策略 toMap 效果 后续 前言 避免过多if - else的新姿势:卫语句、小函数、多态、反射 在之前文章说到,简单 if-else,可以使用 卫语句 进行优化。但是在实际开发中,往往不是简单 if-else 结构,我们通常会不经意间写下如下代码: --------------...

琦彦 3090

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java--使用工厂+策略模式解决if-else/switch分支过多的问题

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

jike11231的博客 5496

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

springboot 使用 策略模式 去除过多的 if else 或 swich case!

一、前言       最近写代码的过程中,发现业务逻辑很多的时候,总会有很多的 if ... else,很多的 if ...else,有的时候就会丢去某些逻辑。有的时候也会用到swich case 来区分不同类型下执行不同的方法。但是往往这种情况的时候,会显得一个方法的代码非常长。为了破解这样的嵌套。我们可以使用策略模式来解决。本篇小编将......

哈士奇 9566

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

策略模式与简单工厂模式:终结if-else混乱,让代码更清爽

在软件开发过程中,我们常常面临着许多问题,其中之一就是如何有效地管理复杂的逻辑和流程。策略模式和工厂模式是两种非常实用的设计模式,可以帮助我们解决这些问题。本文将介绍策略模式和简单工厂模式的概念、实现和应用,并通过实例代码来演示它们的使用方法。策略模式与简单工厂模式可以终结if-else混乱的工作原理是:通过封装算法和对象创建,使得代码更加模块化和可维护

凡夫编程 2013
上一篇: 年前刷完了这份足足485页的“1000道Java工程师面经”,成功上岸!
下一篇: 最实用的 SQL 语句收藏,程序员看完这篇就够了!
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值