策略模式
-
策略模式: 定義一組算法,將每一個算法封裝到具有共同接口的獨立類中,從而使得各個算法之間可以相互替換
- 策略模式屬于行為型模式,可以使得算法在不影響客戶端的情況下自由切換
- 策略模式是對算法的包裝,將使用算法和算法本身分離開來,委托給不同的對象進行管理
- 策略模式通常將一個系列的算法包裝到一系列的策略類中,作為一個抽象策略類的子類
-
策略模式應用場景:
- 當實現(xiàn)某一個功能存在多個算法或者策略時,可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來實現(xiàn)某個功能
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種時,可以將每個算法封裝到策略類中
- 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn),可以將每個條件分支移入各自策略類中來代替這些條件語句
- 系統(tǒng)中各個算法策略彼此獨立,并且要求對客戶端隱藏具體算法的實現(xiàn)細節(jié)
- 系統(tǒng)要求使用算法的客戶不應知道操作的數(shù)據(jù),可以使用策略模式隱藏與算法有關的數(shù)據(jù)結(jié)構(gòu)
- 多個類的區(qū)別只是表現(xiàn)行為的不同,可以使用策略模式在系統(tǒng)運行時選擇需要具體執(zhí)行的行為
-
比如數(shù)據(jù)排序策略的冒泡排序,選擇排序,插入排序和二叉樹排序等
在這里插入圖片描述
- 當實現(xiàn)某一個功能存在多個算法或者策略時,可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來實現(xiàn)某個功能
- 策略模式包含三個角色:
- 環(huán)境Context: 持有一個抽象策略Strategy的引用
- 抽象策略Strategy: 抽象角色.給出所有具體策略類所需的接口,通常是由一個接口或者抽象類實現(xiàn)
- 具體策略ConcreteStrategy: 具體策略類. 封裝了具體的算法
- 策略模式Strategy示例
策略模式總結(jié)
-
策略模式的重點:
- 如何實現(xiàn)算法
- 而是在于如何組織,調(diào)用一系列的算法,從而讓程序的結(jié)構(gòu)更加靈活,具有良好的可維護性以及擴展性
-
算法的平等性:
- 策略模式的一個特點在于各個算法策略的平等性
- 對于一系列算法之間是平等的,只有這樣的算法之間才可以相互替換
- 策略模式中具體策略算法在實現(xiàn)上是相互獨立的,相互之間沒有依賴
-
運行策略的唯一性:
- 在程序運行期間,策略在某一個時間點只能使用一個具體的策略實現(xiàn)對象
- 策略模式可以動態(tài)地在不同的具體算法策略之間進行切換,但在同一個時間點只能使用一個具體算法策略
-
策略模式中公有的行為:
- 通常情況下,策略模式的各個具體策略之間會有一些公有的行為
- 此時,應該將這些各個具體策略之間公有的行為放到共同的抽象策略Strategy類中
- 此時,抽象策略Strategy類可以使用抽象類Abstract實現(xiàn),而非必須使用接口
策略模式優(yōu)點
- 策略模式提供了管理一系列算法的方法. 策略類Strategy的等級結(jié)構(gòu)定義了一個算法或者是行為族,可以通過繼承將公有的代碼放到父類Strategy中,從而避免代碼重復
- 策略模式避免了使用多重條件if-else語句,提高了項目的可維護性
- 策略模式提供相同行為的不同實現(xiàn),客戶端可以根據(jù)不同的時間和空間要求選擇不同的實現(xiàn)策略
- 策略模式完美支持開閉原則,可以在不修改原代碼的情況下,靈活增加新的算法策略
- 策略模式將算法的使用放到環(huán)境類中,算法的實現(xiàn)放到具體策略類中,實現(xiàn)了算法的使用和算法的實現(xiàn)的二者分離
策略模式缺點
- 策略模式只適用于客戶端知道具體算法策略或者行為的情況. 客戶端必須知道所有的策略類,并自行決定使用具體的策略類,也就是說客戶端必須理解這些算法的區(qū)別來決定選擇使用什么樣的算法
- 策略模式會將每一個具體算法策略單獨封裝成一個類,如果存在大量具體算法策略時,會造成系統(tǒng)中存在大量的對象
策略工廠模式
-
在使用策略模式的系統(tǒng)中,當一個系統(tǒng)的存在大量的策略時,客戶端管理的策略算法將很復雜,可以通過在環(huán)境類中使用策略工廠模式來管理這些策略類
在這里插入圖片描述