這里說的策略模式是一種設計模式,經常用於有多種分支情況的程序設計中。例如我們去掉水果皮,一般來說對於不同的水果,會有不同的撥皮方式。此時用程序語言來表示是這樣的:
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 機制就說到這里,如果有什么想了解的,歡迎留言告訴我。