在开发中,经常会有根据参数选择不同实现类的操作,比如常见的去第三方支付中进行预下单
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);
}