策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的:

if(type == apple){
    //deal with apple 
} else if (type == banana){
    //deal with banana
} else if (type == ......){
    //......
}

如上面代码所写,我们用条件语句块去判断不同类型的水果,之后采取不同的剥皮方法。但这种方式在程序设计领域会导致原来的代码被修改,即每次我们要新增一种水果的剥皮,我们必须去修改原来的代码,这样会导致原来的代码不稳定。于是我们采取更好的方式去实现不同水果的剥皮功能,那就是策略模式。

public interface PeelOff {
    void peelOff();
}

public class ApplePeelOff implement PeelOff{
    void peelOff(){
        //deal with apple
    }
}

public class BananaPeelOff implement PeelOff{
    void peelOff(){
        //deal with banan
    }
}

public class PeelOffFactory{
    private Map<String, PeelOff> map = new HashMap();
    private init(){
        //init all the Class that implements PeelOff interface 
      }
}

public static void main(){
    String type = "apple";
    PeelOff peelOff = PeelOffFactory.getPeelOff(type);  //get ApplePeelOff Class Instance.
    peelOff.pealOff();
}

对于这种方法,我们下次要新增一种水果的剥皮方式,我们只需要新建一个水果剥皮类,让它实现 PeefOff 接口就好了。使用策略模式实现的业务逻辑更加灵活,一般经常用来替代程序设计中的条件语句块。

而 SPI 机制其实与策略模式类似,其实 Java 中使用的一种技术实现,全称是 Service Provider Interface,即服务提供接口,一般用在开源框架研发领域。例如 Java 中关于 JDBC 连接的实现就用到了 SPI 机制。在 JDBC 连接中,因为有各种各样的数据库,每种数据库的实现方式都不一样,因此期待 JDK 去把所有的数据库实现一遍是不现实的。于是,JDK 提供了一个接口,你只要按照我的规范去实现,那么我就能够保证用户能连上你的数据库,这套规范就是 SPI 机制。关于 SPI 机制,你可以看我写的另一篇文章,或许你能更好地理解:《我是 SPI,我让框架更加优雅了!》

那么策略模式和 SPI 机制到底有什么区别呢?

如果从代码接入的级别来看,策略模式还是在原有项目中进行代码修改,只不过它不会修改原有类中的代码,而是新建了一个类。而 SPI 机制则是不会修改原有项目中的代码,其会新建一个项目,最终以 Jar 包引入的方式代码。

从这一点来看,无论策略模式还是 SPI 机制,他们都是将修改与原来的代码隔离开来,从而避免新增代码对原有代码的影响。但策略模式是类层次上的隔离,而 SPI 机制则是项目框架级别的隔离。

从应用领域来说,策略模式更多应用在业务领域,即业务代码书写以及业务代码重构。而 SPI 机制更多则是用于框架的设计领域,通过 SPI 机制提供的灵活性,让框架拥有良好的插件特性,便于扩展。

总结一下,策略模式与 SPI 机制有下面几点异同:

  • 从设计思想来看。策略模式和 SPI 机制其思想是类似的,都是通过一定的设计隔离变化的部分,从而让原有部分更加稳定。
  • 从隔离级别来看。策略模式的隔离是类级别的隔离,而 SPI 机制是项目级别的隔离。
  • 从应用领域来看。策略模式更多用在业务代码书写,SPI 机制更多用于框架的设计。

关于策略模式与 SPI 机制就说到这里,如果有什么想了解的,欢迎留言告诉我。

posted @ 2018-09-03 09:35 陈树义 阅读(...) 评论(...) 编辑 收藏