天天看點

政策模式代替臃腫if/else

一、 什麼是政策模式

它對一系列的算法加以封裝,為所有算法定義一個抽象的算法接口,并通過繼承該抽象算法接口 對所有的算法加以封裝和實作,具體的算法選擇 交由用戶端決定(政策)。

政策模式代替臃腫if/else

二、 政策模式的角色

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

2、抽象政策(Strategy)角色: 這是一個抽象角色,通常由一個接口或抽象類實作。此角色給出所有的具體政策類所需的接口。

3、具體政策(ConcreteStrategy)角色: 包裝了相關的算法或行為。

三、政策模式的優缺點

優點:

1、代碼中的if、switch判斷邏輯可以去掉;

2、代碼優雅、可複用、可讀性好、便于維護;

3、政策模式遵循開閉原則,實作代碼的解耦合;

缺點:

1、 政策如果很多的話就會出現很多政策類,會造成政策類膨脹;

2、 使用者必須清楚所有的政策類及其用途;

四、政策模式的實作

政策模式的用意是針對一組算法,将每一個算法封裝到具有共同接口的獨立的類中,進而使得它們可以互相替換。

政策模式使得算法可以在不影響到用戶端的情況下發生變化。使用政策模式可以把行為和環境分割開來。

環境類負責維持和查詢行為類,各種算法則在具體政策中提供。由于算法和環境獨立開來,算法的修改不會影響環境和用戶端。

五、政策模式的編寫步驟

1.對政策對象定義一個公共接口。

2.編寫政策類,該類實作了上面的公共接口。

3.在使用政策對象的類中儲存一個對政策對象的引用。

4.在使用政策對象的類中,實作對政策對象的set和get方法(注入)或者使用構造方法完成指派。

六、實列

抽象折扣類

public interface MemberStrategy {

    /**
     * 計算原油的價格
     * @param crudeOilPrice    原油的原價
     * @return    計算出打折後的價格
     */
    double calcPrice(double crudeOilPrice);
}
      

初級會員折扣類

public class PrimaryMemberStrategyImpl implements MemberStrategy {
    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("對于初級會員的沒有折扣");
        return crudeOilPrice;
    }
}
      

中級會員折扣類

public class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("對于中級會員的折扣為10%");
        return crudeOilPrice * 0.9;
    }
}
      

進階會員折扣類

public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("對于進階會員的折扣為20%");
        return crudeOilPrice * 0.8;
    }
}
      

貴賓會員折扣類

public class VisitantMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double crudeOilPrice) {
        System.out.println("對于貴賓會員的折扣為25%");
        return crudeOilPrice * 0.75;
    }
}
      

價格類

public class Price {

    //持有一個具體的政策對象
    private MemberStrategy strategy;
    /**
     * 構造函數,傳入一個具體的政策對象
     * @param strategy    具體的政策對象
     */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }

    /**
     * 計算原油的價格
     * @param crudeOilPrice    原油的原價
     * @return    計算出打折後的價格
     */
    public double quote(double crudeOilPrice){
        return this.strategy.calcPrice(crudeOilPrice);
    }
}
      

總結:if else作為每種程式設計語言都不可或缺的條件語句,在程式設計時會大量的用到。一般建議嵌套不要超過三層,如果一段代碼存在過多的if else嵌套,代碼的可讀性就會急速下降,後期維護難度也大大提高,可以利用政策模式來替代if/else。

繼續閱讀