【設計模式與Android】策略模式——錦囊裏的上策中策下策

什麼是策略模式

 

所謂策略模式,就是定義一系列的算法,並將每一個算法封裝起來,而且使它們可以相互替換的設計模式。策略模式讓算法獨立於使用它的用戶而獨立變化。一般用於同類問題的不同處理方式或者選擇同一抽象類的不同子類的時候。

 

策略模式的實現方式

 

現在已經沒人懷疑我是文科生了,我寫代碼繼續以文學舉例。《三國演義》第六十二回中劉璋和劉備撕破臉皮後,龐統給劉備制定了三條策略——上計、中計和下計。我們先寫一個決策者劉備類:

public class LiuBei {

    IStrategy iStrategy;

    public void setiStrategy(IStrategy iStrategy) {
        this.iStrategy = iStrategy;
    }

    public String dispatch(String... generals){
        return iStrategy.dispatch(generals);
    }

}

 

我們再指定一個抽象的策略接口:

public interface IStrategy {

    /**
     * 派遣將軍執行計劃
     * @param generals 將軍
     * @return
     */
    String dispatch(String... generals);

}

 

上計:

public class GoodStrategy implements IStrategy {
    @Override
    public String dispatch(String... generals) {
        String goodStrategy = "派";

        for (String general:generals){
            goodStrategy += ("、" + general);
        }

        goodStrategy = goodStrategy.replaceFirst("、","");
        goodStrategy += "只今便選精兵,晝夜兼道徑襲成都";

        return goodStrategy;
    }
}

 

中計:

public class MiddleStrategy implements IStrategy {
    @Override
    public String dispatch(String... generals) {
        String middleStrategy = "派";

        for (String general:generals){
            middleStrategy += ("、" + general);
        }

        middleStrategy = middleStrategy.replaceFirst("、","");
        middleStrategy += "先取涪城,然後卻向成都";

        return middleStrategy;
    }
}

 

下計:

public class BadStrategy implements IStrategy {
    @Override
    public String dispatch(String... generals) {
        String badStrategy = "派";

        for (String general:generals){
            badStrategy += ("、" + general);
        }

        badStrategy = badStrategy.replaceFirst("、","");
        badStrategy += "退還白帝,連夜回荊州,徐圖進取";

        return badStrategy;
    }
}

 

劉備選擇了中計:

LiuBei liuBei = new LiuBei();
liuBei.setiStrategy(new MiddleStrategy());
Log.e("玄德猶有不忍之心",liuBei.dispatch("黃忠","魏延"));

 

預知後事如何,請看本系列文章第一篇的舉例分解。

 

Android源碼中的策略模式

 

(1)TypeEvaluator

研究自定義控件的Android工程師應該都用過ValueAnimator,那麼對ValueAnimator的setEvaluator(TypeEvaluator value)方法一定不陌生,其中TypeEvaluator接口被RectEvaluator和FloatEvaluator等多個類引用。這就是一個典型的策略模式。

 

Android開發中如何利用策略模式

 

(1)策略模式最主要的用途是分離算法,當針對同一類問題的多種處理方式僅是具體行爲有差別可能產生大量不易維護的多分支語句(if-else或switch-case)的時候適合使用策略模式。常見的應用場景比如電商App對購物車中商品每次結算金額的不同優惠券、折扣和郵費策略等。

 

需要注意的幾個問題

 

1) 因爲每個具體策略都會產生一個新策略類,所以會增加系統需要維護的類的數量。

 

2)在基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔。換句話說就是策略模式只適用於客戶端知道算法或行爲的情況。


本系列其他博客


【設計模式與Android】狀態模式——一個人的兩幅面孔


【設計模式與Android】責任鏈模式——曹瞞兵敗走華容


【設計模式與Android】命令模式——軍令如山


【設計模式與Android】觀察者模式——千里眼與順風耳


【設計模式與Android】備忘錄模式——在齊太史簡



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章