什麼是策略模式算法
所謂策略模式,就是定義一系列的算法,並將每個算法封裝起來,並且使它們能夠相互替換的設計模式。策略模式讓算法獨立於使用它的用戶而獨立變化。通常用於同類問題的不一樣處理方式或者選擇同一抽象類的不一樣子類的時候。設計模式
策略模式的實現方式ide
如今已經沒人懷疑我是文科生了,我寫代碼繼續以文學舉例。《三國演義》第六十二回中劉璋和劉備撕破臉皮後,龐統給劉備制定了三條策略——上計、中計和下計。咱們先寫一個決策者劉備類:this
public class LiuBei {
IStrategy iStrategy;
public void setiStrategy(IStrategy iStrategy) { this.iStrategy = iStrategy; }
public String dispatch(String... generals){ return iStrategy.dispatch(generals); }
}lua |
咱們再指定一個抽象的策略接口:spa
public interface IStrategy {
/** * 派遣將軍執行計劃 * @param generals 將軍 * @return */ String dispatch(String... generals);
}設計 |
上計:orm
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; } }對象 |
中計:blog
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】備忘錄模式——在齊太史簡