使用枚举+策略模式规避过多的if-else

在开发中,经常会有根据参数选择不同实现类的操作,比如常见的去第三方支付中进行预下单

public interface PreOrderService {    
    PreOrderResponse preOrder(PreOrderDTO param);
}

常用的微信预下单,支付宝预下单

public class WxPreOrderService implements PreOrderService {
    //wx pre order
    ...
}
public class AliPreOrderService implements PreOrderService {
   //ali pre order
   ...
}

此时有一个需求,需要根据传参调用不同的实现类,如果使用if-else来实现,则代码可能是这样

...

if (type == 1) {
    preOrderService = new WxPreOrderService();
} else {
    preOrderService = new AliPreOrderService();
}

...

这样使用也没问题,但后面可能会出现更多的平台预下单,那么只能不停的添加if条件判断来实现,维护很死板,代码看起来也没那么的简洁和灵性,这里我们可以使用充血枚举的方式来维护这些实现类

@Getter
public enum PreOrderEnums {
    /**
     * 微信预下单实现
     **/
    WX(1, SpringUtil.getBean(WxPreOrderService.class)),
    /**
     * 阿里预下单实现
     **/
    ALI(2, SpringUtil.getBean(AliPreOrderService.class));
    
    
    private Integer type;
    
    private PreOrderService preOrderService;
    
    public PreOrderEnums(int type , PreOrderService preOrderService) {
        this.type = type;
        this.preOrderService = preOrderService;
    }
    
    /**
     * 这里是我们在外部使用需要调用的方法,根据传入的type
     * 来获取不同的PreOrderService实现,后期如果有新的第三方预下单实现,只需要添加对应的
     * 的value即可
     **/
    public static PreOrderService getImpl(int type) {
        for (PreOrderEnums value : PreOrderEnums.values()) {
            if (type == value.getType) {
                return value.getPreOrderService();
            }
        }
        return null;
    }
    
    
}

在外部进行调用

public PreOrderService getImpl(int type) {
    return PreOrderEnums.getImpl(type);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容