策略枚举

策略枚举就是技巧性的代码编写,对于枚举中的抽象方法相应的枚举类型是需要实现这个抽象方法,这样会有个弊端,可能有的枚举类型需要实现的方法内容是一样的,这样显然看来代码会很重复,针对这个问题可以使用策略枚举,这中策略枚举的的思想就是代码的重用,重点就是如何巧妙实现代码的重用下面看代码

*类说明:加班费计算,工作日加班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;    这样可以用一个方法,统一调用变量来计算加班费。达到重用代码的目的,程序更加的优雅!

总结:枚举实例间都有相同的行为,将共同的行为抽取为枚举实例,即两层枚举来定义行为!!!

原文地址:https://www.cnblogs.com/wcss/p/12124065.html