• 策略模式与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 机制就说到这里,如果有什么想了解的,欢迎留言告诉我。

  • 相关阅读:
    点击按钮icon input同步获取焦点
    修改vue项目中 elementUI input样式
    vue $route 和$router的区别
    vue 路由 vue-router 模式 hash history
    vue 路由跳转
    git 合并某个提交 git cherry-pick
    请求传参 有特殊符号
    前端 组件库 ,js等
    ajax请求成功,返回了数据,但是跳到了error情况
    微信-公众号-网页授权开发
  • 原文地址:https://www.cnblogs.com/chanshuyi/p/the_difference_between_spi_and_strategy.html
Copyright © 2020-2023  润新知