1 介紹
策略模式最常用的場景就是用於消除程式碼中的if-else
,這裡所說的if-else
並不是說任何簡單的判斷都引入策略模式來最佳化,這樣反而會增加程式碼的複雜度。
反例:使用策略模式對一個boolean
型別的變數進行最佳化
2 背景
我負責的有一個基於流程引擎開發的專案,有一個功能模組是檢視申請單的詳情,由於不同的申請單展示的資訊各不相同,最開始負責這部分功能開發的同學使用if-else
來判斷申請單的型別,並對不同的申請單做不同的處理。
由於系統中的申請單越來越多,這部分的if-else
分支也變得臃腫,而且每次新增申請單的時候,都需要在後面再加一個分支,不僅破壞了開閉原則,而且可讀性極差,也不利於擴充套件。
3 引入策略介面
不同的申請單有自己處理detail的邏輯,實現這個策略介面,重寫 doDetail()
即可
這是一個預設實現:
4 引入策略上下文物件
有了策略介面後,現在需要一個上下文物件將所有的策略放在一個集合中,方便後續呼叫
這裡使用了 spring 框架提供的 applycationContext
來獲取策略介面的所有實現類,在策略上下文物件完成初始化後,將實現類註冊到 map
中。(@PostConstruct:在bean初始化完成後處理一些邏輯)
5 客戶端呼叫
只要持有 策略上下文物件,就能拿到策略介面的實現類,從而執行相關邏輯:
6 總結
後續開發的同學新增申請單的時候,只需要新增一個詳情類,實現策略介面,重寫方法即可,大大提高了這部分功能的擴充套件性。
關於策略上下文物件使用集合儲存所有策略的解釋:使用 Map
來儲存,需要一個key來標識使用哪種策略來處理。