这里说的策略模式是一种设计模式, 经常用于有多种分支情况的程序设计中. 例如我们去掉水果皮, 一般来说对于不同的水果, 会有不同的拨皮方式. 此时用程序语言来表示是这样的:
- 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 机制就说到这里, 如果有什么想了解的, 欢迎留言告诉我.
来源: https://www.cnblogs.com/chanshuyi/p/the_difference_between_spi_and_strategy.html