設計模式(七)—— 策略模式
1. 定義
策略模式定義了一系列的演算法,並將每一個演算法封裝起來,使每個演算法可以相互替代,使演算法本身和使用演算法的客戶端分割開來,相互獨立。
2. 結構
(1)策略介面角色IStrategy:用來約束一系列具體的策略演算法,策略上下文角色使用此策略介面來呼叫具體的策略所實現的演算法。
(2)具體的策略實現角色ConcreteStrategy:具體的策略實現。
(3)策略上下文角色StrategyContext:負責和具體的策略實現互動,通常策略上下文物件會持有一個真正的策略實現物件,策略上下文還可以讓具體的策略實現從其中獲取相關資料,回撥策略上下文物件的方法。
3. 具體實現
(1)策略介面
public interface IStrategy {
public void testMethod();
}
(2) 具體的策略實現
public class ConcreteStrategy1 implements IStrategy {
@Override
public void testMethod() {
System.out.println("this is ConcreteStrategy1 method");
}
}
public class ConcreteStrategy2 implements IStrategy { @Override public void testMethod() { System.out.println("this is ConcreteStrategy2 method"); } }
(3)策略上下文
public class StrategyContext {
private IStrategy strategy;
public StrategyContext(IStrategy strategy) {
this.strategy = strategy;
}
public void contextMethod() {
strategy.testMethod();
}
}
(4) 外部客戶端
public class Client { public static void main (String[] args) { //建立具體策略實現 IStrategy strategy = new ConcrategyStrategy2(); //在建立策略上下文的同時,將具體的策略實現物件注入到策略上下文中 StrategyContext ctx = new StrategyContext(strategy); //呼叫策略上下文物件的方法來完成對具體策略實現的呼叫 ctx.contextStrategy(); } }
策略模式的重點不是如何實現演算法,而是如何組織和呼叫這些演算法,從而讓我們的程式結構更加靈活、可擴充套件。
策略模式就是把各個平等的具體實現進行抽象封裝成獨立的演算法類,然後通過上下文和具體的演算法類互動。各個策略演算法都是平等的,所以它們可以互相替換,雖然可以動態切換各個演算法,但是同一時刻只能使用一個策略。
我們上面的策略介面採用的是介面的形式來定義的, 其實這個策略介面,是廣義上的介面,不是語言層面的interface,也可以是抽象類,如果對個演算法具有共有的資料,則可以將策略介面設計成一個抽象類,把公共的東西放到抽象類裡面去。
4. 策略模式的優點
(1)策略列都實現了同一個介面,因此策略類之間可以自由切換。
(2)易於擴充套件,增加一個新的策略只需要新增一個具體的策略類即可,基本不需要改變原有程式碼。
(3)避免過多使用多重條件語句(if else)
5. 策略模式的缺點
(1)客戶端必須瞭解所有的策略,這暴露了策略的具體實現。
(2)增加了物件的數量,由於將每個演算法都封裝成一個策略類,如果可選的策略有很多的話,那物件的數量也會很多。
(3)只適合扁平的演算法結構,各個策略實現的都是平等關係,限制了演算法的使用層級,且不能被巢狀。
參考資料:https://www.cnblogs.com/lewis0077/p/5133812.html