記得在中學時代,每次考完老師評講試卷,都會說這道題有多少種解法,然後在黑板上板書第一種、第二種解法。其實這個情況就類似於今天的情況,也就是策略模式。他表示的是在遇到一種問題有多種解法的時候,我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。OK,正式開始今天的文章。
一、理解策略模式
為了更好的理解這個模式,我們再舉一個例子,我們出去旅遊的時候可能有很多種出行方式,比如說我們可以坐火車、坐高鐵、坐飛機等等。不管我們使用哪一種出行方式,最終的目的地都是一樣的。也就是選擇不同的方式產生的結果都是一樣的。
有了這個例子,我相信你應該對其思想有了一個基本的認識,下面看一下其正式的概念介紹:
定義一系列的算法,把每一個算法封裝起來, 並且使它們可相互替換
二、實現策略模式
策略模式把對象本身和運算規則區分開來,因此我們整個模式也分為三個部分。
環境類(Context):用來操作策略的上下文環境,也就是我們遊客。抽象策略類(Strategy):策略的抽象,出行方式的抽象具體策略類(ConcreteStrategy):具體的策略實現,每一種出行方式的具體實現。下面我們代碼去實現一遍就能很清楚的理解了,
第一步:定義抽象策略接口
第二步:具體策略類
第三步:環境類實現
三、分析策略模式
1、為什麼要使用策略模式?
策略模式的優點:
我們之前在選擇出行方式的時候,往往會使用if-else語句,也就是用戶不選擇A那麼就選擇B這樣的一種情況。這種情況耦合性太高了,而且代碼臃腫,有了策略模式我們就可以避免這種現象,策略模式遵循開閉原則,實現代碼的解耦合。擴展新的方法時也比較方便,只需要繼承策略接口就好了上面列出的這兩點算是策略模式的優點了,但是不是說他就是完美的,有很多缺點仍然需要我們去掌握和理解,
客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。策略模式會出現很多的策略類。context在使用這些策略類的時候,這些策略類由於繼承了策略接口,所以有些數據可能用不到,但是依然初始化了。2、與其他模式的區別?
(1)與狀態模式的區別
策略模式只是條件選擇方法,只執行一次方法,而狀態模式是隨著狀態的改變不停地更改執行方法。舉個例子,就好比我們旅遊,對於策略模式我們只需要選擇其中一種出行方法就好了,但是狀態模式不一樣,可能我們到了A地點選擇的是火車,到了B地點又選擇飛機,根據不同的狀態選擇不同的出行方式。
(2)與工廠模式的區別
工廠模式是創建型模式 ,它關注對象創建,提供創建對象的接口,讓對象的創建與具體的使用客戶無關。 策略模式是對象行為型模式 ,它關注行為和算法的封裝 。再舉個例子,還是我們出去旅遊,對於策略模式我們只需要選擇其中一種出行方法就好,但是工廠模式不同,工廠模式是你決定哪種旅行方案後,由工廠代替你去構建具體方案(工廠代替你去買火車票)。
3、使用場景是什麼?
說實話,對於設計模式來說,使用場景僅僅只是舉一兩個例子。如果你能夠理解我們出去旅遊的這個案例,基本上你也就能在自己遇到這種情況的時候自動的去選擇它。這裡就不說了。
OK,策略模式還是比較簡單的。一句話說明白就是一個問題有好幾種解法,我們選擇其中一種就可以了。