接口优于反射

接口优于反射

写在前面:最近在做一个需求:要针对不同的度量模型来执行不同的方法,同时要让后面接手的开发同学用最少的代码、最简单的方式来复用并实现更多度量模型。该需求一方面学到了一个新的设计模式——模板方法设计模式。另外一方面还得到一个经验————接口优于反射。

Effective Java的作者说接口优先于反射机制,这个之前就有看过,但是当时也没搞明白接口和反射能有啥联系,直到最近。才发现这句话的确是有道理的。

我的需求:
有一批度量模型,要根据这些度量模型定义的规则给所有应用计算分数,不同的度量模型的计算方法需要对应不同的算法。整个计算过程需要离线计算(通过定时任务定时执行)。

我刚开始的做法(使用反射):

定义一个枚举:

public enum MeasureModelEnum {
    CHECK_SPECIFIC_DEV_OWNER("execute","com.alibaba.intl.batch.sla.service.impl.SpecificDevOwnerCalculator");
    /**
     * 要执行的方法名
     */
    String method;
    /**
     * 要执行的类的全路径名
     */
    String clazz;

    private MeasureModelEnum(String method ,String clazz){
        this.method = method;
        this.clazz =  clazz;
    }

    public String getMethod(){
        return this.method;
    }
    public String getClazz(){
        return this.clazz;
    }
}

然后用以下代码遍历枚举项,执行对应的方法:

for(MeasureModelEnum measureModel :MeasureModelEnum.values()){
    String calculateMethod =  measureModel.getMethod();
    String calculateClass = measureModel.getClazz();
    Class<?> class1 = null;
    class1 = Class.forName(calculateClass);
    Method method = class1.getMethod(calculateMethod,List.class,LeafMeasureModel.class);
    method.invoke(class1.newInstance(),items,measureModel);
}

后来的做法(使用接口):

定义一个枚举:

public enum MeasureModelLeafNode {
    CHECK_SPECIFIC_DEV_OWNER(new SpecificDevOwnerCalculator());
    //SpecificDevOwnerCalculator是AbstractNodeCalculator的实现类
    /**
     * 实现类
     */
    AbstractNodeCalculator calculateNode ;
    private MeasureModelLeafNode(AbstractNodeCalculator calculateNode){
        this.calculateNode =  calculateNode;
    }
    public AbstractNodeCalculator getMeasureModel(){
        return this.calculateNode;
    }
}

然后用以下代码遍历枚举项,执行对应的方法:

for(MeasureModelLeafNode measureModel:MeasureModelLeafNode.values()){
    measureModel.getMeasureModel().execute(items, measureModel);
}

总结

以上两部分代码的内容都是遍历枚举项,然后执行execute()方法进行逻辑处理。区别在于一个使用反射调用方法,一个使用接口+多态的形式执行方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值