策略+枚举 优雅的消灭 if-else
1、需求举例
假如有这样一个需求,需实现一周七天内分别知道要做事情的备忘功能,这里面就会涉及到一个流程判断,你可能会立马想到用 if-else,那么,可能是会这样实现:
//if-else形式判断
public String getToDo(String day){
if("Monday".equals(day)){
......省略复杂语句
return "今天上英语课";
}else if("Tuesday".equals(day)){
.....省略复杂语句
return "今天上语文课";
}else if("Wednesday".equals(day)){
......省略复杂语句
return "今天上数学课";
}else if("Thursday".equals(day)){
......省略复杂语句
return "今天上音乐课";
}else if("sunday".equals(day)){
......省略复杂语句
return "今天上编程课";
}else{
此处省略10086行......
}
}
可能初学者都会忽略掉一点,其实 if-else 是一种面向过程的实现。
那么,如何避免在面向对象编程里大量使用 if-else 呢?
网络上有很多解决思路,有工厂模式、策略模式、甚至是规则引擎(这个太重了吧)…
这些,都有一个共同的缺点,使用起来还是过于繁重了。虽说避免出现过多的 if-else,但是,却会增加很多额外的类,我总觉得,很不实用,只能当做某种模式的学习即可。
可以替换大量的 if-else 语句,且具备较好的可读性与扩展性,同时能显得轻量化,我比较推荐使用策略枚举来消除 if-else。
2、策略枚举
首先,先定义一个 getToDo() 调用方法,假如传进的是“星期一”,即参数"Monday"。
//策略枚举判断
public String getToDo(String day){
CheckDay checkDay=new CheckDay();
return checkDay.day(DayEnum.valueOf(day));
}
在getToDo()方法里,通过DayEnum.valueOf(“Monday”)可获取到一个DayEnum枚举元素,这里得到的是Monday。
接下来,执行checkDay.day(DayEnum.valueOf(“Monday”)),会进入到day()方法中,这里,通过dayEnum.toDo()做了一个策略匹配时。注意一点,DayEnum.valueOf(“Monday”)得到的是枚举中的Monday,这样,实质上就是执行了Monday.toDo(),也就是说,会执行Monday里的toDo()——
public class CheckDay {