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

Posted 熬过无人问津的日子才会有远方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用策略模式+工厂模式干掉代码中过多的if-else相关的知识,希望对你有一定的参考价值。

过多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的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

在 Spring Boot 中,如何干掉 if else

策略模式+工厂方法消除if...else

一起学设计模式状态模式+装饰器模式+简单工厂模式实战:提交个订单我到底经历了什么鬼?