如何消除if else

在你的代码中是否经常出现这种情况,用很长一串的switch case语句以及if else语句来执行对应的功能模块,并且各个分支模块中共同的部分也还不少,当后续迭代量上来后,随之而来的模块分支可能也会增多,有什么方法可以消除分支吗?

迭代模式

首先可能我们会想到把所有涉及到的分支模块提取出来封装成统一的接口形式,然后把分支条件和对应的实现类匹配起来,把这些对应关系放到Map里面,当在执行到需要处理的时候通过迭代来处理对应的实现类,这样我们是消除了if else语句带来的问题,但是有想过后续如果新来一个分支,我们还是要要修改Map的东西,把新加的分支关系加入进去,这样一来耦合度还是不高。

预先把映射关系初始化好

我们可不可以通过spring的InitializingBean在初始化的时候把类型和对应的实现类关系初始化完。这样后续新增一个分支只需要在对应的实现类新增对应的分支类型就可以。这样耦合度就比上面的迭代方式低。
下面是具体实现大致流程

我们利用一个接口把各个模块的功能代码写入到各自的实现类里面,并且各个实现类里面定义好一个标识,写一个实现类实现InitializingBean里面的afterPropertiesSet方法,把各个实现类通过map的形式以标识为key 对应的实现类接口为Value 进行迭代组装起来,这个过程是在spring启动初始化的时候其实就把对应接口所对应的具体实现类已经初始化完成了,最后当程序执行时候就通过key自动识别出对应的实现类,从而代替了if else

定义处理器接口

这个处理器接口用于替代 if else,以便去掉用的时候我们可以只传入一个类型就能自动匹配出对应的方法实现类。

/**
 * 
 * @author huqiang YF0649  
 * 
 */
public interface ShopifyReviseHandlerService {
    
  
    
    /**
     * 获取对应的处理器
     * 
     * @param reviseType
     *            变更类型
     * @return 对应的处理器
     * @exception NoMatchReviseTypeException
     *                在无可用处理器时抛出
     */
    ShopifyReviseManagerService getReviseHandler(Integer reviseType);
}

具体实现类,实现类需要实现InitializingBean

@Service
public class ShopifyHandlerServiceImpl implements ShopifyReviseHandlerService, InitializingBean {

	/** slf4j日志 */
	private static final Logger LOGGER = LoggerFactory.getLogger(ShopifyHandlerServiceImpl.class);
	private final Map<Integer, ShopifyReviseManagerService> reviseHandlerMap = new HashMap<>();

	/**
	 * 这块在spring初始化的时候就把ShopifyReviseManagerService接口下面的具体实现类已经初始化完成
	 */
	@Autowired
	private List<ShopifyReviseManagerService> reviseHandlers;

	/**
	 * 初始化完成后通过迭代,以类型-实现类的MAP组装起来
	 * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		for (ShopifyReviseManagerService reviseHandler : reviseHandlers) {
			if (reviseHandlerMap.containsKey(reviseHandler.supportReviseType())) {
				LOGGER.warn("revise type must be unique:{} ", reviseHandler.supportReviseType());
			} else {
				reviseHandlerMap.put(reviseHandler.supportReviseType(), reviseHandler);
			}
		}
	}

	/**
	 * 当调用getReviseHandler的时候就能自动取出对应的实现类
	 * @see com.yafex.system.service.ShopifyReviseHandlerService#getReviseHandler(java.lang.Integer)
	 */
	@Override
	public ShopifyReviseManagerService getReviseHandler(Integer reviseType) {

		return reviseHandlerMap.get(reviseType);

	}

这样我们就把所有的各个功能实现类通过ShopifyReviseHandlerService 接口组装起来了

最后在代码中你只需调用getReviseHandler方法就能拿到对应的方法实现类,这样就替代了if else。