最容易懂的策略模式消除if-else分支,實現開閉原則,提高可擴展性
1 介紹
策略模式最常用的場景就是用于消除代碼中的if-else
,這里所說的if-else
并不是說任何簡單的判斷都引入策略模式來優化,這樣反而會增加代碼的復雜度。
反例:使用策略模式對一個boolean
類型的變量進行優化
2 背景
我負責的有一個基于流程引擎開發的項目,有一個功能模塊是查看申請單的詳情,由于不同的申請單展示的信息各不相同,最開始負責這部分功能開發的同學使用if-else
來判斷申請單的類型,并對不同的申請單做不同的處理。
由于系統中的申請單越來越多,這部分的if-else
分支也變得臃腫,而且每次新增申請單的時候,都需要在后面再加一個分支,不僅破壞了開閉原則,而且可讀性極差,也不利于擴展。
3 引入策略接口
不同的申請單有自己處理detail的邏輯,實現這個策略接口,重寫 doDetail()
即可
這是一個默認實現:
4 引入策略上下文對象
有了策略接口后,現在需要一個上下文對象將所有的策略放在一個集合中,方便后續調用
這里使用了 spring 框架提供的 applycationContext
來獲取策略接口的所有實現類,在策略上下文對象完成初始化后,將實現類注冊到 map
中。(@PostConstruct:在bean初始化完成后處理一些邏輯)
5 客戶端調用
只要持有 策略上下文對象,就能拿到策略接口的實現類,從而執行相關邏輯:
6 總結
后續開發的同學添加申請單的時候,只需要新增一個詳情類,實現策略接口,重寫方法即可,大大提高了這部分功能的擴展性。
關于策略上下文對象使用集合存儲所有策略的解釋:使用 Map
來存儲,需要一個key來標識使用哪種策略來處理。