一、策略者UML圖

策略模式.png
二、概念
策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
Context(應用場景):
1、需要使用ConcreteStrategy提供的算法。
2、內部維護一個Strategy的實例。
3、負責動態(tài)設置運行時Strategy具體的實現(xiàn)算法。
4、負責跟Strategy之間的交互和數(shù)據(jù)傳遞。
Strategy(抽象策略類):
1、 定義了一個公共接口,各種不同的算法以不同的方式實現(xiàn)這個接口,Context使用這個接口調用不同的算法,一般使用接口或抽象類實現(xiàn)。
ConcreteStrategy(具體策略類):
2、 實現(xiàn)了Strategy定義的接口,提供具體的算法實現(xiàn)。
根據(jù)策略模式的定義,我們結合自己的需求,可以想到把不同播放器的調用方法封裝成不同的算法,一個播放器對應一個播放算法、策略Strategy(LHAVPlayer、LHIJKPlayer),再封裝一個供客戶端調用的通用的播放器Context應用場景(LHPlayer)來負責Strategy之間的交互和數(shù)據(jù)傳遞。
三、應用場景
1、 多個類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現(xiàn)。
3、 對客戶隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立
不同的第三方播放器只區(qū)別在播放、暫停、停止等一系列方法的實現(xiàn)和調用上的不同。我們的需求就是在未來可能會使用不同的播放器,而這些對客戶來說應該是隱藏的,不關心具體細節(jié)的,彼此完全獨立的。所以,完全可以通過策略模式來解決我們的需求。下面我們看其代碼實現(xiàn)。
四、優(yōu)缺點
優(yōu)點
1、 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼轉移到父類里面,從而避免重復的代碼。
2、 策略模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態(tài)改變算法或行為變得不可能。
3、 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個多重轉移語句里面,比使用繼承的辦法還要原始和落后。
缺點
1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當?shù)乃惴?。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
2、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數(shù)量。
三、和抽象工廠模式的區(qū)別
1. 相似:
在模式結構上,兩者很相似;
2.差別:
用途不一樣
工廠是創(chuàng)建型模式,它的作用就是創(chuàng)建對象;
策略是行為型模式,它的作用是讓一個對象在許多行為中選擇一種行為;
關注點不一樣
一個關注對象創(chuàng)建
一個關注行為的封裝
解決不同的問題
工廠模式是創(chuàng)建型的設計模式,它接受指令,創(chuàng)建出符合要求的實例;它主要解決的是資源的統(tǒng)一分發(fā),將對象的創(chuàng)建完全獨立出來,讓對象的創(chuàng)建和具體的使用客戶無關。主要應用在多數(shù)據(jù)庫選擇,類庫文件加載等。
策略模式是為了解決的是策略的切換與擴展,更簡潔的說是定義策略族,分別封裝起來,讓他們之間可以相互替換,策略模式讓策略的變化獨立于使用策略的客戶。
工廠相當于黑盒子,策略相當于白盒子;
工廠模式:有一天你決定去吃KFC,一看菜單,哦,種類很多呀,你就點了個老北京,過了二十分鐘,你的老北京就來了就可以吃到了。但這個老北京是怎么做的,到底面粉放了多少,雞肉放了多少,佐料放了多少,有多少到工序,你是不需要管的,你需要的是一個美味老北京。
所以上面的老北京是創(chuàng)建型模式,有了工廠,有了具體的抽象方法。只要繼承相應的流程。
策略模式:同樣還是在KFC,你要一個老北京,老板說想吃自己去做吧。原料有雞肉、面粉、佐料。工序有1、2、3工序,你自己去做吧。然后你就需要自己按照策略去做,到底放多少培根,放多少面粉,放多少佐料,這都你自己來決定,工序1、2、3,你是怎么實現(xiàn)的,都你自己決定。最后你得到了老北京。
另外一個例子,出行旅游的策略。(坐火車、飛機、汽車、等,多個策略)