摘要: 由於業務場景復雜,一個算法需要開發行為變化多端的多個實現類,然后在系統運行時根據不同場景裝載不同的類實例。為了使應用程序具有更好的靈活性、可擴展性和代碼的可重用性,在借鑒前人處理方法的基礎上,通過資料的分析,探索建立了一套 Spring Boot 項目動態綁定算法相關實現類實例並調用其函數的策略,主要涉及的知識點包括責任鏈模式、策略模式、工廠模式和模板方法模式等四個設計模式,以及Spring IoC技術和Spring注解等。
§前言
在軟件開發過程中,由於客戶的業務場景比較復雜,需要一個功能根據不同的業務場景表現出不同的行為。例如,出去旅游時,可供選擇的交通工具有多種,諸如飛機、高鐵、大巴和順風車等,但是對系統而言,入口應該僅有一個,就是調用的函數是同一個,不過是由不同的實現類幫你規划不同的交通工具,然后根據選定的交通工具計算交通費。
我情不自禁地思考了一個問題,在目前的Java web項目開發中,相信大家基本上是基於Spring框架的,那么Spring是怎樣從IoC容器中准確而優雅地動態綁定我們想要的實現類實例的呢?
§業務場景
需求描述:定制一個繪圖工具,她根據客戶端發送的指令可以畫出正方形、矩形、圓形和三角形等各種各樣的幾何圖形。例如,當客戶端需要繪制三角形的時候,就調用繪制三角形的方法;當需要繪制圓形的時候,就調用繪制圓形的方法。
業務分析:我們需要根據圖形標識查找該圖形的Bean實例,從而調用該實例中的繪圖函數繪制指定圖形。其本質就是方法的多態。
方法多態:方法的多態就是一個方法名稱有不同的實現,其實就是方法的重載,在調用方法的時候具體調用哪一-個是在運行期根據傳遞的實際參數的類型來確定調用哪一個方法,也就是同一個方法名稱可以有不同的表現形式,這就是方法的多態。方法多態的表現就是方法的重載。
初步想到的設計方案就是如《Spring Boot中使用注解實現簡單工廠模式》中“實現方法一:基於新建對象實現”所言,在簡單工廠模式中通過傳遞幾何圖形類型信息,由 if else或者case等條件判斷語句逐個判斷,然后獲取實體類的對象,源碼如下圖所示:
試想一下,如果繪圖工具由於業務拓展,需要添加越來越多的圖形,比如:新增五角星、仙人掌圖、五邊形、六邊形等等,就需要修改工廠類,增加新的else...if判斷,判斷多了就會導致邏輯越來越多,使代碼充滿臭味道。
很明顯,這樣的代碼違反了設計模式六大原則中的開閉原則和單一職責原則:
開閉原則:對擴展開放,對修改關閉。就是說增加新功能要盡量少改動已有代碼。
單一職責原則:顧名思義,要求邏輯盡量單一,不要太復雜,便於復用。
那有什么辦法可以實現業務需求的同時,碼出優雅且易擴展的代碼呢?
§解決方案
本篇博文以一系列博文的形式,使用Spring Boot 2.3.0.RELEASE版本,基於Spring 注解、責任鏈模式、策略模式、工廠模式和模板方法模式等知識點向大家展示如何解決這個問題。博文包括以下幾篇:
- Spring注解之@Autowired:按類型自動裝配Bean到數組、集合和Map;
- 獲取Spring ApplicationContext容器上下文對象實例;
- Spring Boot中使用注解實現簡單工廠模式;
- 使用模板方法模式動態綁定多實現類實例;
- 使用責任鏈模式動態綁定多實現類實例;
- 使用策略模式和工廠模式動態綁定多實現類實例;
- 使用自定義注解動態綁定多實現類實例。
前兩篇介紹Spring Bean和IoC容器相關的基本知識,為后面幾篇做鋪墊。上述博文所用軟件開發環境如下:
♦ java version 13.0.1
♦ IntelliJ IDEA 2019.3.2 (Ultimate Edition)
♦ Spring Boot 2.3.0.RELEASE
§結束語
你如果計划跳槽,那就認真看看這些博客吧,只有掌握真正的技術才能如出水蛟龍,下山猛虎一樣碾壓面試官,拿到心滿意足的offer。 你如果正在被這些技術困擾,更要仔仔細細地閱讀幾遍了。
老鐵們, 因樓蘭胡楊個人能力有限,難免有瑕疵,如果發現bug或者有更好的idea,那么請不吝賜教,在文章下方評論區留下你的神評妙論!