策略模式屬於對象的行爲模式,其用意就是針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,從而使得它們能夠相互替換。策略模式使得算法能夠在不影響客戶端的狀況下發生變化。
策略模式 是對算法的包裝,是把使用算法的責任和算法自己分割開,委派給不一樣的對象管理。策略模式一般把一個系列的算法包裝到一系列的策略類裏,做爲一個抽象策略類的子類。
這個模式涉及
三個角色:
1.環境(Context)角色:持有一個Strategy類的引用
2.抽象策略(Strategy)角色:抽象角色,一般由一個接口或抽象類實現,此角色給出全部具體策略類所須要的接口
3.具體策略(ConcreteStrategy)角色:包裝了相關的算法或行爲
示例代碼:
1 public class StrategyTest {
2 public static void main(String[] args) {
3 //此處能夠靈活加入想要具體策略類
4 Context con = new Context(new ConcreteStrategy());
5 con.contextInterface();
6 }
7
8 }
9 //環境角色
10 class Context{
11 private Strategy strategy;
12 public Context(Strategy s){
13 this.strategy = s;
14 }
15 //策略方法
16 public void contextInterface(){
17 strategy.strategyInterface();
18 }
19 }
20 //抽象策略類
21 abstract class Strategy{
22 public abstract void strategyInterface();
23 }
24 //具體策略類
25 class ConcreteStrategy extends Strategy{
26
27 @Override
28 public void strategyInterface() {
29 System.out.println("Do strategy");
30 }
31
32 }
在下面狀況下應當使用策略模式:
1.若是一個系統裏有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲
2.一個系統須要動態地在幾種算法中選擇一種。那麼這些算法能夠包裝到一個個的具體算法類裏面,而這些算法類都是一個抽象類的子類。
3.一個系統的算法使用的數據不可讓客戶端知道。策略模式能夠避免讓客戶端涉及到沒必要要接觸到的複雜的和只與算法有關的數據
4.若是一個對象有不少的行爲,若是不恰當的模式,這些行爲就只好使用重的條件選擇語句來實現。此時,使用策略模式,把這些行爲轉移到相應的具體策略類裏面,就能夠避免使用難以維護的多重選擇語句,並體現面向對象設計
優勢:
1.提供了管理相關的算法族的辦法
2.提供了能夠替換繼承關係的辦法。繼承能夠處理多種算法或行爲。若是不用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每個子類提供了一個不一樣的算法或行爲。這樣算法和行爲的使用者混在一塊兒,從而不可能再獨立演化。類繼承使得動態改變算法或行爲變得 不可能
3.能夠避免使用多重條件轉移語句。多重條件轉移語句不易維護,它把採起那一種算法或採起那一種行爲的使用者和算法或行爲自己混在一塊兒,通通列在一個多重轉移語句裏,比使用繼承的辦法還要原始和落後。
策略模式缺點:
1.客戶端必須知道全部的策略類,並自行決定使用那一個策略類
2.策略模式形成不少的策略類。有時,可 以經過把依賴於環境的狀態保存到客戶端裏面,而將策略類設計成能夠共享的,這樣策略類實例能夠被不一樣客戶端使用。可使用享元模式來減小對象的數量。