Strategy Pattern(策略模式)
生活随笔
收集整理的這篇文章主要介紹了
Strategy Pattern(策略模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
意圖
定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。適用性
1. 許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。2. 需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的算法。當這些變體實現為一個算法的類層次時,可以使用策略模式。
3. 算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。
4. 一個類定義了多種行為, 并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
結構
參與者:
> Strategy(策略)?
— 定義所有支持的算法的公共接口。Context使用這個接口來調用某 ConcreteStrategy定 義的算法。?
> ConcreteStrategy(具體策略)?
— 以Strategy接口實現某具體算法。?
> Context(上下文)?
— 用一個ConcreteStrategy對象來配置。
— 維護一個對Strategy對象的引用。
— 可定義一個接口來讓Stategy訪問它的數據。?
例子
優缺點
> 優點:* 算法可以自由切換
這是策略模式本身定義的,只要實現抽象策略,它就成為策略家族的一個成員,通過封裝角色對其進行封裝,保證對外提供“可自由切換”的策略。 ?
* 避免使用多重條件判斷
如果沒有策略模式,我們想想看會是什么樣子?一個策略家族有5個策略算法,一會要使用A策略,一會要使用B策略,怎么設計呢?使用多重的條件語句?多重條件語句不易維護,而且出錯的概率大大增強。使用策略模式后,可以由其他模塊決定采用何種策略,策略家族對外提供的訪問接口就是封裝類,簡化了操作,同時避免了條件語句判斷。 ??
* 擴展性良好
這甚至都不用說是它的優點,因為它太明顯了。在現有的系統中增加一個策略太容易了,只要實現接口就可以了,其他都不用修改,類似于一個可反復拆卸的插件,這大大地符合了OCP原則。
> 缺點:
* 策略類數量增多
每一個策略都是一個類,復用的可能性很小,類數量增多。 ??
* 所有的策略類都需要對外暴露
上層模塊必須知道有哪些策略,然后才能決定使用哪一個策略,這與迪米特法則是相違背的,我只是想使用了一個策略,我憑什么就要了解這個策略呢?那要你的封裝類還有什么意義?這是原裝策略模式的一個缺點,幸運的是,我們可以使用其他模式來修正這個缺陷,如工廠方法模式、代理模式或享元模式。
總結
以上是生活随笔為你收集整理的Strategy Pattern(策略模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Singleton Pattern(单例
- 下一篇: 设计模式总结之Composite Pat