最近在对接一个业务功能,用到了前人写的代码功能点,需要在上边做功能,之前的写法就是if-else的判断,已经有四个这样的判断,而我这次的功能,如果要在之前的基础上继续开发的话,需要再加两个if-else判断,这样开发起来是快,但是凭着好的习惯来说,我还是想把这块代码重构下,方便后续代码的可读性和可扩展性。
其实去掉if-else这样的写法,一定是有个前提的,就是代码已经有点堆砌,并且随着后续业务的发展,还有可能继续增加,在这样的前提下就需要考虑进行代码重构了。至于重构方式,其实是通用的,基本上就是工厂模式+策略模式,接下来看下我们的处理。
重构的业务大致说明下:其实就是查询功能,但是条件不一样,一级菜单总共有4个,每个下边又有二级菜单,不同的二级菜单,查询的地址不一样。
看下原先的代码写法:
已经有5处if-else的判断了,我要是再加的话就需要再加两个了,看下重构后的方式:
重新定义枚举说明:
OrderTabEnum
public enum OrderTabEnum {
ALL(0,0, "全部","allIncomeService"),
SPREAD_ORDER(1, 1,"推广收入-会员卡","orderIncomeService"),
SPREAD_CONTENT(1, 2,"推广收入-分享影片","contentIncomeService"),
SPREAD_CARD(1, 4,"推广收入-联名银行卡","bankCardIncomeService"),
RED_ORDER(2, 1,"红包收入-会员卡","orderIncomeService"),
RED_CONTENT(2, 2,"红包收入-分享影片","contentIncomeService"),
RED_JOINRED(2, 3,"红包收入-拉新红包(超过6个人才会返现)","joinRedIncomeService"),
RED_CARD(2, 4,"红包收入-联名银行卡","bankCardIncomeService"),
AWARD(3, 0,"奖金收入","awardIncomeService");
OrderTabEnum(Integer firstMenuValue, Integer twoMenuValue,String desc,String service) {
this.firstMenuValue = firstMenuValue;
this.twoMenuValue = twoMenuValue;
this.desc = desc;
this.service=service;
}
/**
* 一级菜单
*/
private Integer firstMenuValue;
/**
* 二级菜单
*/
private Integer twoMenuValue;
private String desc;
private String service;
public Integer getFirstMenuValue() {
return firstMenuValue;
}
public void setFirstMenuValue(Integer firstMenuValue) {
this.firstMenuValue = firstMenuValue;
}
public Integer getTwoMenuValue() {
return twoMenuValue;
}
public void setTwoMenuValue(Integer twoMenuValue) {
this.twoMenuValue = twoMenuValue;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
}
工厂类:
IncomePageFactory
@Component
public class IncomePageFactory {
@Resource
private ApplicationContext applicationContext;
public IncomePageService getIncomePageService(Integer incomeType, Integer incomeTab){
if(OrderTabEnum.ALL.getFirstMenuValue().equals(incomeType)){
return (IncomePageService)applicationContext.getBean(OrderTabEnum.ALL.getService());
}
if(OrderTabEnum.AWARD.getFirstMenuValue().equals(incomeType)){
return (IncomePageService)applicationContext.getBean(OrderTabEnum.AWARD.getService());
}
......
return null;
}
}
抽取公共接口,相同的入参和出参
public interface IncomePageService {
/**
* 获取收入明细信息
* @param params
* @return
*/
PageListResult<IncomePageDTO> getIncomePageInfo(Map<String, Object> params);
}
不同业务实现接口:
里边就是具体的业务实现了,然后修改入口处,直接一行代码搞定,简单明了。
return incomePageFactory.getIncomePageService(incomeType, incomeTab).getIncomePageInfo(params);