课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > java的策略模式结合简单工厂模式
  • java的策略模式结合简单工厂模式

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

  • 昆明Java培训班的老师原来已经讲过简单工厂模式了,对于Custom类中的checkVocationDays方法中的多个ifelse判断,可以使用简单工厂模式来进行改进,创建简单工厂如下:

    public class CalDaysFactory {

    private CalDaysFactory(){}

    public static VacationDays create(int workYears){

    if(workYears >= 20){

    return new FiftenDays();

    }else if(workYears >= 10){

    return new TenDays();

    }else if(workYears >= 1){

    return new FiveDays();

    }else{

    return new NoneHoliday();

    }

    }

    }

    此时,我们的Custom类中的checkVocationDays方法就可以简化为如下所示的方式:

    public void checkVocationDays(int workYears,int nowCompanyYears){

    days = CalDaysFactory.create(workYears);//简单工厂模式

    }

    其他代码保持不变,这样我们的上下文类也就是Custom类中就不需要再去根据ifelse进行判断,将判断的工作转移到简单工厂中去;

    使用简单工厂模式后,虽然将ifelse的判断转移到简单工厂中去了,但是在添加新的策略时还需要修改添加判断语句,同样是对修改开放的,昆明Java培训班的老师使用了反射的方法消除添加新的策略时要修改工厂类的弊 ,但是有一个问题是与具体的策略类耦合严重,客户端必须知道策略类中具体的算法才能调用,如下所示:

    public class ReflectFactory {

    public static VacationDays create(Class<?> cla){

    VacationDays product = null;

    try {

    product = (VacationDays) cla.newInstance();

    } catch (InstantiationException e) {

    e.printStackTrace();

    } catch (IllegalAccessException e) {

    e.printStackTrace();

    }

    return product;

    }

    }

    如果使用上述的简单工厂,那么我们的Custom类就变成了如下所示:

    public void checkVocationDays(int workYears){

    if(workYears < 1){

    days = ReflectFactory.create(NoneHoliday.class);

    }else if(workYears >= 1 && workYears < 10){

    days = ReflectFactory.create(FiveDays.class);

    }else if(workYears >= 10 && workYears < 20){

    days = ReflectFactory.create(TenDays.class);

    }else if(workYears >= 20){

    days = ReflectFactory.create(FiftenDays.class);

    }

    }

    虽然功能没有发生变化,但是还是需要进行ifelse判断,并没有彻底消除,只不过是判断的位置又回到了Custom类而已。

    下一期我们亲爱的昆明Java培训班的老师还会继续给大家讲策略模式的消除判断。

    推荐文章

上一篇:java之策略模式

下一篇:策略模式中怎么注解消除判断语句

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56