插件+平台开发模式

  在进入正题之前我们先看一个场景,相信大家都使用过计算器,输入几个数字,再输入要做的操作,最后就能得到我们想要的结果。假如让我们自己来写一个计算器,要求拥有加,减两个简单功能,代码该怎么实现?

      我相信很多人都会写出如下的代码:

public class CalculatorService {

    public float calculate(float param1,float param2,String operation){
        if("+".equals(operation)){
            return  param1 + param2;
        } else if ("-".equals(operation)) {
            return  param1 - param2;
        }
        return 0;
    }
}

  看起来没毛病,但如果我需增加一个功能时,需要修改方法calculate业务逻辑代码,显然违反了开放封闭原则。也许还有人会将计算逻辑进行抽象封装,具体如下:

public interface Calculator {

    float calculate(float param1,float param2);

}

public class PlusCalculator  implements Calculator {

    @Override
    public float calculate(float param1, float param2) {
        return param1+param2;
    }
}

public class MinusCalculator  implements Calculator {

        @Override
        public float calculate(float param1, float param2) {
            return param1-param2;
        }
}

public class CalculatorService {

    public float calculate(float param1,float param2,String operation){
        if("+".equals(operation)){
            return  new PlusCalculator().calculate(param1,param2);
        } else if ("-".equals(operation)) {
            return  new MinusCalculator().calculate(param1,param2);
        }
        return 0;
    }
}

  上面实现计算策略和业务代码分离,这点有进步,但是当增加第三种计算功能时,需要增加Calculator实现类,且还需要修改方法calculate,仍然违反了开放封闭原则。我们在做新需求时,总是希望尽量不动少动原有业务逻辑,只关心我们需要关心的业务实现,当然这也要求我们的架构支持这种扩展性,显然if else  或者switch 肯定不是我们的最佳选择。那么有没有更好的方式呢?  

  其实Calculator实现类的增加和operation 类型增加有密切对应关系,假设有个注册机存放operation 与对应处理类关系,那知道某个operation 就能顺利找到对应计算策略,这个问题不是就迎刃而解了么? 相信大家看到这里已经明白了,最简单的不就是使用map结构存储么?就是这么简单,看如下代码:

public class CalculatorService {

    private Map<String,Calculator> map;  //注册操作类型与计算策略类

    public float calculate(float param1,float param2,String operation){
        Calculator calculator = map.get(operation);
        if (calculator != null) {
            return  calculator.calculate(param1,param2);
        }
        return 0;
    }

    public void setMap(Map<String, Calculator> map) {
        this.map = map;
    }
}

当增加一个操作类型时,只需要关心增加类型对应计算策略逻辑,再把operation与对应计算策略注册到map即可。很完美,有木有!!!大家想想上面这个计算器的实现方式是不是跟操作系统安装软件或者eclipse安装插件很相似,这种思想也就是今天小编要给大家分享的插件式开发。

 

  什么是插件式开发?

  插件式服务:就是一个主服务程序和多个插件程序。其中,主程序:用于判断需要调用哪个插件服务进行运行。插件:主要实现单独的功能逻辑。具体结构见下图:

                  

  每增加扩展信息时,主程序不需要任何修改,只需要增加一个插件接口实现,并进行插件注册即可。

 

总结:插件式开发核心要点不在于技术有多牛,而是善于在业务中抽取出不变和变化点,再将变化进行封装。

 

posted @ 2017-07-31 20:50  潇碧叶  阅读(896)  评论(2)    收藏  举报