背景:
最近公司开始自建供应链系统,我接手了商家端各个系统的开发和重构任务,说实话对于一些祖传代码看起来真的很头疼,没办法只能一步一步的去梳理原理的业务逻辑,本篇主要记录下有关if- else 在项目重构时的一些案例和心得。
目的:代码可扩展、可维护。
- 使用工厂模式和策略模式
重构前:
if (VendorCheckStatusEnum.PASS.getCode() == checkStatus) {//doSomething} else {//doSomething}
重构后:
//工厂类StrategyFactorypublic class StrategyFactory {private StrategyFactory() {}private static Map<Integer, SignStrategyService> services = new ConcurrentHashMap<>();public static void registerSign(Integer type, SignStrategyService signStrategyService) {services.put(type, signStrategyService);}public static SignStrategyService getSignStrategy(Integer type) {return services.get(type);}
}//定义接口
public interface SignStrategyService {void sign(SignRequest request);}//接口实现
@Service
public class SignOffLineServiceImpl implements SignStrategyService, InitializingBean {@Overridepublic void sign(SignRequest request) {//doSomething }@Overridepublic void afterPropertiesSet() {StrategyFactory.registerSign(VendorCheckEnum.FAIL_CHECK.getCode(), this);}@Service
public class SignOnLineServiceImpl implements SignStrategyService, InitializingBean {@Overridepublic void sign(SignRequest request) {//doSomething }@Overridepublic void afterPropertiesSet() {StrategyFactory.registerSign(VendorCheckEnum.SUCCESS_CHECK.getCode(),this);}
}//调用者
SignStrategyService strategy=StrategyFactory.getSignStrategy(vendor.getIsChecked());strategy.sign(signRequest);
重构后虽然增加了代码量,但是对于后面增加的一些校验类型避免了更多if -else 的出现,重构之后逻辑清晰,职责更加明确。
- 使用枚举
public enum VendorConfigEnum {/*** 默认配置*/TOLERATION(0) {@Overridepublic Object builder(VendorConfig vendorConfig) {return vendorConfig.getConfigInfo();}},/*** 地址配置*/ADDRESS(1) {@Overridepublic Object builder(VendorConfig vendorConfig) {return JSON.parseArray(vendorConfig.getConfigInfo(), AddressTemplate.class);}};private Integer type;public abstract Object builder(VendorConfig vendorConfig);public static VendorConfigEnum getInstance(Integer type) {for (VendorConfigEnum configEnum : values()) {if (configEnum.getType().equals(type)) {return configEnum;}}return null;}
//调用者
Object configInfo = VendorConfigEnum.getInstance(vendorConfig.getConfigType()).builder(vendorConfig);
本次重构从实际的业务出发对原有逻辑的改造,上面两种方式并不一定是适合所有的业务场景,如果大家有更好的方式欢迎交流!