定義:
定義了算法家族,分別封裝起來,讓它們之間可以互相替換, 此模式讓算法的變化不會影響到使用算法的用戶。
可以通過策略模式清除大量的if..else。
適用場景
系統有很多類,而他們的區別僅僅在於他們的行爲不同
一個系統需要動態地在幾種算法中選擇一種
優點:
滿足開閉原則
避免使用多重條件轉移語句
提高算法的保密性和安全性:只需要知道策略類是幹什麼的,而不需要知道具體實現
缺點:
客戶端必須知道所有的策略類,並自行決定使用哪一個策略類
產生很多策略類
和其他模式的區別:
策略模式和工廠模式:工廠模式是創建型的設計模式,接受指令創建出符合要求的對應對象,而策略模式是行爲型的,接受已經創建好的對象,從而實現不同的行爲
策略模式和狀態模式:策略模式是需要知道要挑選哪一種策略進行處理,而狀態模式不需要知道具體的狀態,會自動轉換
如何消除if-else的判斷?
可以通過把判斷的邏輯視作爲key,結合工廠模式和策略模式進行處理。
源代碼:https://github.com/NoSuchClass/design_pattern/tree/master/src/behavioral/strategy
In JDK
interface Comparator<T>
比較器就是一個策略,每個具體的策略都需要實現這個接口下的方法
In Spring
interface Resource
也是一個策略,來進行加載各種不同位置的文件類型,比如常見的ClassPathContextResource
interface InstantiationStrategy
在Spring初始化bean的時候,也使用到了策略模式
這是Spring中InstantiationStrategy的兩個實現,這兩個實現並不是同級的,還存在策略與策略之間的繼承關係