參考《Java設計模式》、《設計模式之禪》、《headfirst設計模式》
目錄
一、簡介
策略模式是一個計劃或方式,給定一個輸入條件,獲得一個輸出。通常策略會提供一組可互換的方法。
- 提供一個接口,將不同的可互換的策略抽離出來,封裝在各自獨立的類來實現接口
使用背景:
- 程序存在多種策略時,策略的選擇和執行邏輯混合在一個方法時,導致複雜度增加時,即可使用策略模式來簡化。
二、使用策略模式
需要以下步驟:
- 創建一個接口來定義策略操作
- 分別用不同的類來實現該策略接口
- 重構代碼,選擇使用正確的策略類
例子:廣告引擎之廣告推薦
三、策略模式的優缺點
3.1 優點:
- 策略可以自由切換
- 避免使用多重條件判斷:把判斷選擇策略的邏輯放到其他模塊,策略家族只提供訪問接口
- 擴展性良好
3.2 缺點:
- 策略類數量增多
- 所有的策略類都需要對外暴露
- 上層模塊必須知道有哪些策略,才能決定使用哪個,與迪米特法則相違背。只使用了一個策略,爲什麼要知道其他策略呢?
- 解決方法:結合其他模式來修正該缺陷:如工廠方法、代理模式或者享元模式
- 備註:迪米特原則:迪米特原則簡介
迪米特法則(Law of Demeter, LoD)是1987年秋天由lan holland在美國東北大學一個叫做迪米特的項目設計提出的,它要求一個對象應該對其他對象有最少的瞭解,所以迪米特法則又叫做最少知識原則(Least Knowledge Principle, LKP)。
四、使用場景及注意事項
4.1 使用場景
- 多個類只在策略或者行爲上稍有不同
- 策略需要自由切換的場景
- 例如策略的選擇由使用者決定,或者策略始終在金華
- 需要屏蔽策略規則的場景
4.2 注意事項
如果策略數量超過4個,則需要考慮混合模式。實際項目中,一般通過工廠方法模式來實現策略類的聲明