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

  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/chanshuyi/p/the_difference_between_spi_and_strategy.html
Copyright © 2011-2022 走看看