設計模式之策略模式(Strategy Pattern)

模式分析:

        策略模式:將可變的部分從程序中抽象分離成算法接口,在該接口下分別封裝一系列算法實現。並使他們能夠相互替換,從而致使客戶端程序獨立於算法的改變。java

使用場景:

  • 許多相關的類僅僅是行爲差別
  • 運行時選取不一樣的算法變體
  • 經過條件語句在多個分支中選取一

優缺點:

    優勢:算法

  1. 提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承能夠把公用的代碼移到父類裏面,從而能夠避免重複的代碼。
  2. 策略模式提供了能夠替換繼承關係的辦法。繼承能夠處理多種算法行爲。若是不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每個子類提供一個不一樣的算法行爲。可是,這樣一來算法或行爲的使用者就和算法或行爲自己混在一塊兒。決定使用哪種算法或採起哪種行爲的邏輯就和算法或行爲的邏輯混合在一塊兒,從而不能再獨立煙花。繼承使得動態改變算法或行爲變得不可能。
  3. 使用策略模式能夠避免使用多重條件轉移語句。

    缺點:ide

  1. 客戶端必須知道全部的策略類,並自行決定使用哪個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。
  2. 策略模式形成不少的策略類。

DEMO:

//策略接口
public interface MemberStrategy {
    /**
     * 計算圖書的價格
     * @param bookPrice 圖書的原價
     * @return 打折後的價格
     */
    public double calcPrice(double bookPrice);
}

//初級會員優惠策略
public class PrimaryMemberStrategy implements MemberStrategy{

    @Override
    public double calcPrice(double bookPrice) {
        System.out.println("初級會員沒有折扣");
        return bookPrice;
    }
}
//中級會員優惠策略
public class IntermediateMemberStrategy implements MemberStrategy{

    @Override
    public double calcPrice(double bookPrice) {

        System.out.println("中級會員折扣20%");
        return bookPrice * 0.8;
    }
}
//高級會員優惠策略
public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double bookPrice) {
        System.out.println("高級會員折扣50%");
        return bookPrice * 0.5;
    }
}
//
public class Price {

    private MemberStrategy memberStrategy;

    public Price(MemberStrategy memberStrategy){
        this.memberStrategy = memberStrategy;
    }

    public double quote(double bookPrice){

        return this.memberStrategy.calcPrice(bookPrice);
    }
}
//測試
public static void main(String[] args) {
        MemberStrategy strategy = new AdvancedMemberStrategy();
        Price price = new Price(strategy);
        System.out.println(price.quote(200D));
}
相關文章
相關標籤/搜索