設計模式 —— 策略模式

簡介

策略模式(Strategy Pattern)屬於對象的行爲模式。其用意是針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,從而使得它們能夠相互替換。策略模式使得算法能夠在不影響到客戶端的狀況下發生變化。java

策略模式是對算法的包裝,是把使用算法的責任和算法自己分割開來,委派給不一樣的對象管理。策略模式一般把一個系列的算法包裝到一系列的策略類裏面,做爲一個抽象策略類的子類。用一句話來講,就是:「準備一組算法,並將每個算法封裝起來,使得它們能夠互換」。算法

實例

策略模式及到三個角色:微信

  1. 抽象策略角色(Strategy):這是一個抽象角色,一般由一個接口或抽象類實現。此角色給出全部的具體策略類所需的接口;
  2. 具體策略角色(ConcreteStrategy):包裝了相關的算法或行爲;
  3. 上下文角色(Context):對策略進行二次封裝,目的是避免高層模塊對策略的直接調用。

在電商系統中,一般會集成多種支付方式。下面以一個支付調用例子演示下策略模式。框架

抽象角色:ide

public interface IPayStrategy {
    /** * 調用支付 */
    void doPay();
}
複製代碼

具體策略模式:微信支付

// 支付寶支付
public class AliPayStrategy implements IPayStrategy {
    @Override
    public void doPay() {
        System.out.println("調用支付寶支付~");
    }
}

// 微信支付
public class WxPayStrategy implements IPayStrategy {
    @Override
    public void doPay() {
        System.out.println("調用微信支付~");
    }
}
複製代碼

上下文角色:this

public class PayContext {

    private IPayStrategy payStrategy;

    public PayContext(IPayStrategy payStrategy) {
        this.payStrategy = payStrategy;
    }

    /** * 策略方法 */
    public void doPay() {
        payStrategy.doPay();
    }
}
複製代碼

客戶端:spa

public class Client {
    @Test
    public void testPay() {
        PayContext context;

        //調用支付寶支付
        context = new PayContext(new AliPayStrategy());
        context.doPay();

        // 調用微信支付
        context = new PayContext(new WxPayStrategy());
        context.doPay();
    }
}
複製代碼

結果:設計

調用支付寶支付~
調用微信支付~
複製代碼

類圖

策略模式

優勢

  1. 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承能夠把公共的代碼移到父類裏面,從而避免代碼重複;
  2. 使用策略模式能夠避免使用多重條件(if-else)語句。多重條件語句不易維護,它把採起哪種算法或採起哪種行爲的邏輯與算法或行爲的邏輯混合在一塊兒,通通列在一個多重條件語句裏面,比使用繼承的辦法還要原始和落後。

缺點

  1. 客戶端必須知道全部的策略類,並自行決定使用哪個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道算法或行爲的狀況;
  2. 因爲策略模式把每一個具體的策略實現都單獨封裝成爲類,若是備選的策略不少的話,那麼對象的數目就會很可觀。

適用場景

  1. 若是在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲;
  2. 一個系統須要動態地在幾種算法中選擇一種;
  3. 若是一個對象有不少的行爲,若是不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。

與 SPI 的區別

SPI 機制其實與 策略模式 相似。SPI 機制是 Java 中使用的一種技術實現,全稱是 Service Provider Interface,即服務提供接口,通常用在開源框架研發領域。code

策略模式SPI 機制有下面幾點異同:

  1. 從設計思想來看。策略模式和 SPI 機制其思想是相似的,都是經過必定的設計隔離變化的部分,從而讓原有部分更加穩定;
  2. 從隔離級別來看。策略模式的隔離是類級別的隔離,而 SPI 機制是項目級別的隔離;
  3. 從應用領域來看。策略模式更多用在業務代碼書寫,SPI 機制更多用於框架的設計。

總結

策略模式 是對算法的封裝,把一系列的算法分別封裝到對應的類中,而且這些類實現相同的接口,相互之間能夠替換。

策略模式 是一種簡單經常使用的模式,咱們在進行開發的時候,會常常有意無心地使用它,通常來講,策略模式 不會單獨使用,跟 模版方法模式、工廠模式 等混合使用的狀況比較多。

相關文章
相關標籤/搜索