阿里面试官:使用策略模式+工厂模式干掉代码中过多的if-else
2023-02-18 16:38:04 时间
过多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);
}
此断代码看起来就清爽多了,实现的基本思路就是使用了 策略模式+工厂模式,代码通过不同的文件类型返回对应的实现类来实现复制逻辑
基本视频步骤
- 创建IFileService接口
public interface IFileService {
Integer getFileType();
MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType);
}
- 视频/音频/图片/文件类分别视频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;
}
}
- 创建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了。
相关文章
- 【FAQ】应用内支付服务无法拉起支付页面常见原因分析和解决方法
- Java面试题之:raft 协议和 zab 协议区别
- 租房“免押金”大面积落地,年底租房人群迎来一点甜
- 简单描述 MySQL 中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)
- 面试官问:Stream 中的 map、peek、foreach 方法的区别?彻底懵了。。
- 广电5G:“农村包围城市”还是内容创新为王?
- 华为、苹果竞争未完,平板赛道再成舞台
- 月销10万+!长城汽车全面发力“森林式生态体系”结硕果
- 鲲鹏生态下,长沙“计算”产业再登新高度
- 盘点四大运营商的5G套餐亮点,国庆出游上车5G不用愁!
- 帮您总结了面试中常用的PHP函数,您不进来看看吗?
- 面试过程中Mysql数据库常被问到的问题详解
- 面向对象是面试时提问最多的吗?
- 几道很有代表性的PHP面试题,研究研究有助于面试加分
- 【404】你访问的页面需要关灯后查看!
- 摸鱼搞了个掘金数据监控桌面应用,还不快用起来!
- 这个实现不对,要的是excel里面的高亮重复项效果
- 精选Github计算机开源视觉项目
- 腾讯云大数据流计算 Oceanus 在 MySQL CDC Connector 的核心优化
- 网宿科技携手亚马逊云科技,助力云计算成为真正的生产力