一天一個設計模式:策略模式

概念:

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

結構:

環境(Context)角色:持有一個Strategy的引用。

抽象策略(Strategy)角色:這是一個抽象角色,一般由一個接口或抽象類實現,此角色給出全部的具體策略類所需的接口。

具體策略(ConcreteStrategy)角色:包含具體場景的算法。

代碼示例:

環境角色:

public class Context {
    //持有一個具體策略的對象
    private Strategy strategy;
    /**
     * 構造函數,傳入一個具體策略對象
     * @param strategy    具體策略對象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){
        
        strategy.strategyInterface();
    }
    
}
View Code

抽象策略類:

public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}
View Code

具體策略類:

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相關的業務
    }

}

//後面兩個重複這個類
View Code

使用常見:

咱們以手抓餅訂單爲例,即有普通手抓餅,高級手抓餅,頂級手抓餅。算法

場景就是接單類,根據具體的算法來生產不一樣的手抓餅訂單。ide

接單類:

public class ReceiveOrder {
    private ShouzhuabingOrder shouzhuabingOrder;

    public ReceiveOrder(ShouzhuabingOrder shouzhuabingOrder) {
        this.shouzhuabingOrder = shouzhuabingOrder;
    }

    //其實這咱們能夠對該函數進行一些功能強化,讓其在算法選擇的基礎上進行一些功能的擴展
    //具體的能夠參考java中Collections類下面的sort方法。
    //例如咱們能夠經過參數做爲輸入,至關於用戶除了作定製化的手抓餅外,還能夠再次基礎上進行個性化的定製。
    public String makeOrder() {
        return shouzhuabingOrder.makeOrder();
    }
}
View Code

手抓餅訂單接口:

public interface ShouzhuabingOrder {

    public String makeOrder();
}
View Code

普通手抓餅:

public class OriginOrder implements ShouzhuabingOrder {
    @Override
    public String makeOrder() {
        return "我是基礎的手抓餅,只有一張餅,一個蛋還有各類醬";
    }
}
View Code

高檔手抓餅:

public class MediumOrder implements ShouzhuabingOrder {

    @Override
    public String makeOrder() {
        return "我是一箇中級手抓餅,自帶一張餅,兩個蛋,還有自制醬料";
    }
}
View Code

豪華手抓餅:

public class HighOrder implements ShouzhuabingOrder {
    @Override
    public String makeOrder() {
        return "我是高級手抓餅,我有一張餅,兩個蛋,一個裏脊,一個薄脆還有自制醬料。";
    }
}
View Code

實際的接受訂單的過程:

public class Test {
    public static void main(String[] args) {
        HighOrder highOrder = new HighOrder();

        ReceiveOrder receiveOrder = new ReceiveOrder(highOrder);

        System.out.println(receiveOrder.makeOrder());
    }
}
View Code

 

策略模式的核心:

  無論算法的實現,而是對算法作一個選擇,組織,調用,從而使程序在結構上更加清晰,也更加方便維護和擴展。函數

策略模式的平等性:

  算法的地位相同,能夠相互替換,相互無依賴,策略模式中的算法關係未:相同行爲的不一樣實現。this

策略模式運行時的惟一性:

  運行時,每個時刻只能使用一個具體的策略實現對象,雖然能夠動態切換,可是在同一時刻,只能是一個。spa

共有行爲:

  若全部算法均有具體的行爲,能夠將算法接口改爲抽象類,同時共有的行爲進行定義。3d

 

策略模式的優勢:

  1.策略模式提供了管理相關算法的算法族的方法,能夠將部分共有代碼移到父類,從而避免重複。code

  2.使用策略模式,能夠避免重複條件的斷定(if-else)。對象

策略模式的缺點:

  1.客戶端必須知道全部的策略,並自行決定使用哪一種策略,以便選用合適的算法。(我尚未想明白這點,這自行判斷還不是要依賴if else)blog

  2.備選的策略多的話,類的數量會不少,不方便管理。

相關文章
相關標籤/搜索