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

1496 篇文章 10 订阅
1494 篇文章 14 订阅

过多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了。

                       资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值