策略枚举:这种枚举通过枚举嵌套枚举的方式,将枚举常量分类处理。
案例:计算不同职位的人的工资,虽然职位不同,但是不同职位的人的工作类型可能是相同的,同类型的人的工资计算方式是一样;
JAVA和PYTHON老师的工资计算方式都属于TEACHER,TEACHER老师类型是基本工资+课时费+绩效奖励
校长的工资计算方式ADMINISTRATION,ADMINISTRATION行政类型是基本工资+绩效奖励
package com.dream.test05;
public enum Salary {
// 不同情况属于不同的工资计算方式
JAVA(Type.TEACHER),
PYTHON(Type.TEACHER),
PRINCIPAL(Type.TEACHER);
private Type type;
private Salary() {
}
private Salary(Type type) {
this.type = type;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
// 计算工资
double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements){
return type.getSalary(baseSalary, classHour, teachingHourSubsidy, achievements);
}
//每个类型的工资计算方式不同
// TEACHER老师类型是基本工资+课时费+绩效奖励
// ADMINISTRATION行政类型是基本工资+绩效奖励
enum Type{
TEACHER {
@Override
double getSalary(double baseSalary, int classHour, double teachingHourSubsidy, double achievements) {
// TODO Auto-generated method stub
return baseSalary+classHour*teachingHourSubsidy+achievements;
}
},
ADMINISTRATION {
@Override
double getSalary(double baseSalary, int classHour, double teachingHourSubsidy, double achievements) {
// TODO Auto-generated method stub
return baseSalary+achievements;
}
};
abstract double getSalary(double baseSalary,int classHour,double teachingHourSubsidy,double achievements);
}
}
package com.dream.test05;
public class Test01 {
public static void main(String[] args) {
System.out.println("JAVA老师工资"+Salary.JAVA.getSalary(1000, 80, 10, 100));
System.out.println("PYTHON老师工资"+Salary.PYTHON.getSalary(500, 80, 10, 100));
System.out.println("校长工资"+Salary.PRINCIPAL.getSalary(1000, 8, 10, 1000));
}
}