昆明java培训
达内昆明广州春城路

18487146383

热门课程

策略模式中怎么注解消除判断语句

  • 时间:2016-10-19
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训班的老师今天给大家讲的知识点是怎么注解消除判断语句。

创建注解类

既然使用注解的方式,那么首先需要一个注解类,因为我们是根据工作年限来判断年假的天数,因此注解中需要有两个值,分别表示工作年限的上下边界,由此创建的注解类如下所示:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface ValidateRange {

int max() default 60;

int min() default 0;

}

其中max表示工作年限的上边界,默认是60,下边界是0。

给策略类添加注解

给已经编写好的各个策略类都添加上上面完成的注解,昆明Java培训班的老师只举一个例子,其他类似:

@ValidateRange(min=1,max=10)

public class FiveDays implements VacationDays{

@Override

public int getVacationDays() {

System.out.println("工作1到10年,年假5天");

return 5;

}

}

上述注解表示,工作年限是在1年到10年之间,其他的策略类大家自行添加注解即可;

修改简单工厂

修改简单工厂这一部分昆明Java培训班的老师先直接贴上代码:

public class DaysSimpleFactory {

private static final String STRATEGY_PACKAGE = "com.strategy";//这里是一个常量,表示我们扫描策略的包,这是LZ的包名

private ClassLoader classLoader = getClass().getClassLoader();//我们加载策略时的类加载器,我们任何类运行时信息必须来自该类加载器

private List<Class<? extends VacationDays>> daysList;//策略列表

/*根据注解生成实例*/

public VacationDays create(int workYears){

//在策略列表查找策略

for(Class<? extends VacationDays> cla : daysList){

//获取该策略的注解

ValidateRange [] ranges = cla.getDeclaredAnnotationsByType(ValidateRange.class);

ValidateRange range = null;

if(ranges.length > 0){

range = ranges[0];

}

//判断工作年限是否在注解的区间

if(workYears >= range.min() && workYears < range.max()){

try {

//是的话我们返回一个当前策略的实例

return cla.newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

return null;

}

/*单例模式*/

private DaysSimpleFactory(){

initStrategy();

}

/*实例化工厂时,初始化策略类列表*/

@SuppressWarnings("unchecked")

private void initStrategy() {

daysList = new ArrayList<Class<? extends VacationDays>>();

File [] resources = getResources();

Class<VacationDays> classzz = ull;

try {

classzz = (Class<VacationDays>) classLoader.loadClass(VacationDays.class.getName());

} catch (ClassNotFoundException e) {

throw new RuntimeException("未找到策略资源");

}

for(File file:resources){

try {

//载入包下的类

Class<?> clazz = classLoader.loadClass(STRATEGY_PACKAGE + "."+file.getName().replace(".class", ""));

//判断是否是CalPrice的实现类并且不是CalPrice它本身,满足的话加入到策略列表

if (VacationDays.class.isAssignableFrom(clazz) && clazz != classzz) {

daysList.add((Class<? extends VacationDays>) clazz);

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

private File[] getResources() {

try {

File file = new File(classLoader.getResource(STRATEGY_PACKAGE.replace(".", "/")).toURI());

return file.listFiles(new FileFilter() {

@Override

public boolean accept(File pathname) {

if(pathname.getName().endsWith(".class")){//只需要class文件

return true;

}

return false;

}

});

} catch (URISyntaxException e) {

throw new RuntimeException("未找到策略资源");

}

}

public static DaysSimpleFactory getInstance(){

return SingletonFactory.factory;

}

private static class SingletonFactory{

private static DaysSimpleFactory factory = new DaysSimpleFactory();

}

关于这一部分的代码,思路是这样的,在初始化简单工厂类时就去策略类所在的包,初始化策略类的集合,然后在生成相应的策略时,在策略列表中循环查找工作年限在对应的策略类的注解范围内的策略,如果存在,就使用反射的方式生成一个策略实例返回,此时Custom类就变成如下所示:

public void checkVocationDays(int workYears,int nowCompanyYears){

days = DaysSimpleFactory.getInstance().create(workYears);//注解方式消除ifelse方式的简单工厂模式

}

使用注解的方式就可以完全消除掉恶心的ifelse语句了。

上一篇:java的策略模式结合简单工厂模式
下一篇:java培训:使用多个策略

AI初创企谷歌跑在前面了!达内java培训

‘资产荒’为什么这么说?【达内培训】

java集合-Iterator迭代

阿里云澳门战略携手创“城市大脑”——达内编程培训

选择城市和中心
贵州省

广西省

海南省

台湾