策略枚举就是技巧性的代码编写,对于枚举中的抽象方法相应的枚举类型是需要实现这个抽象方法,这样会有个弊端,可能有的枚举类型需要实现的方法内容是一样的,这样显然看来代码会很重复,针对这个问题可以使用策略枚举,这中策略枚举的的思想就是代码的重用,重点就是如何巧妙实现代码的重用下面看代码
*类说明:加班费计算,工作日加班2倍,节假日3倍
*/
public enum BetterPayDay { MONDAY(PayType.WORK), TUESDAY(PayType.WORK), WEDNESDAY( PayType.WORK), THURSDAY(PayType.WORK), FRIDAY(PayType.WORK), SATURDAY(PayType.REST), SUNDAY(PayType.REST),WUYI(PayType.REST); private final PayType payType;//成员变量 BetterPayDay(PayType payType) { this.payType = payType; } double pay(double hoursOvertime) { return payType.pay(hoursOvertime); } //策略枚举 private enum PayType { WORK { double pay(double hoursOvertime) { return hoursOvertime*HOURS_WORK; } }, REST { double pay(double hoursOvertime) { return hoursOvertime*HOURS_REST; } }; private static final int HOURS_WORK = 2; private static final int HOURS_REST = 3; abstract double pay(double hoursOvertime);//抽象计算加班费的方法 } public static void main(String[] args) { System.out.println(BetterPayDay.MONDAY.pay(7.5)); } }
计算加班费的方法 如果不用策略枚举的方式写结算,而是在BetterPayDay 中写一个抽象方法,那么周一 到周五 都是同样的代码乘以2倍的工资,这样重复的代码,写起来显然不合适,这是内部在定义一个枚举类,这个枚举的类中定义的行为就是专门计算加班费,所以定义两个枚举类型的行为一个是计算工作日的加班费,另一个是计算节假日的加班费,然后对应的枚举类型传入BetterPayDay 枚举类中的每个枚举类型的参数中,即BetterPayDay的构造中应当传入策略枚举类的实例,所以BetterPayDay 应当有 此成员变量private final PayType payType; 这样可以用一个方法,统一调用变量来计算加班费。达到重用代码的目的,程序更加的优雅!
总结:枚举实例间都有相同的行为,将共同的行为抽取为枚举实例,即两层枚举来定义行为!!!