最容易懂的策略模式消除if-else分支,實現開閉原則,提高可擴充套件性

小馮同學c發表於2023-02-04

1 介紹

策略模式最常用的場景就是用於消除程式碼中的if-else,這裡所說的if-else並不是說任何簡單的判斷都引入策略模式來最佳化,這樣反而會增加程式碼的複雜度。

反例:使用策略模式對一個boolean型別的變數進行最佳化

2 背景

我負責的有一個基於流程引擎開發的專案,有一個功能模組是檢視申請單的詳情,由於不同的申請單展示的資訊各不相同,最開始負責這部分功能開發的同學使用if-else來判斷申請單的型別,並對不同的申請單做不同的處理。

由於系統中的申請單越來越多,這部分的if-else分支也變得臃腫,而且每次新增申請單的時候,都需要在後面再加一個分支,不僅破壞了開閉原則,而且可讀性極差,也不利於擴充套件。

3 引入策略介面

不同的申請單有自己處理detail的邏輯,實現這個策略介面,重寫 doDetail()即可

這是一個預設實現:

4 引入策略上下文物件

有了策略介面後,現在需要一個上下文物件將所有的策略放在一個集合中,方便後續呼叫

這裡使用了 spring 框架提供的 applycationContext 來獲取策略介面的所有實現類,在策略上下文物件完成初始化後,將實現類註冊到 map 中。(@PostConstruct:在bean初始化完成後處理一些邏輯)

5 客戶端呼叫

只要持有 策略上下文物件,就能拿到策略介面的實現類,從而執行相關邏輯:

6 總結

後續開發的同學新增申請單的時候,只需要新增一個詳情類,實現策略介面,重寫方法即可,大大提高了這部分功能的擴充套件性。

關於策略上下文物件使用集合儲存所有策略的解釋:使用 Map 來儲存,需要一個key來標識使用哪種策略來處理。

相關文章