Android 設計模式 - 策略模式
1. 定義
策略模式(Strategy Pattern):定義一系列演算法,將每一個演算法封裝起來,並讓它們可以相互替換,讓演算法獨立於使用它的客戶而變化。
2. 作用
策略模式是對演算法的封裝,它把演算法的責任和演算法本身分離,委派給不同的物件管理。策略模式通常把演算法封裝到一系列的策略類裡面,作為抽象策略類的子類。用一句話來說,就是「準備一組演算法,並將每個演算法封裝起來,使得它們可以互換」。策略模式並不決定在何時使用何種演算法,演算法的選擇由客戶端來決定。
3. 角色
- 上下文:對策略進行二次封裝,目的是避免高層模組對策略的直接呼叫。
- 抽象策略:通常情況下是一個介面,當各個實現類中存在著重複的邏輯時,則使用抽象類來封裝這部分公共的程式碼,此時,策略模式看上去更像是模版方法模式。
- 具體策略:具體策略角色通常由一組封裝了演算法的類來擔任,這些類之間可以根據需要自由替換。
4. 實現
就拿出行方式來舉個例子,我們去上班的方式有許多,可以開車、坐公交、騎車等。那麼就可以把出行方式抽象出一個策略介面,各種具體的方式是策略實現,在出門時就可以自由選擇啦。

類圖
- 定義抽象策略,就是出行方式。
public interface IOutWay { /** * 外出方式 */ void goOut(); }
- 定義具體策略,可以是汽車、公交出行。
public class CarWay implements IOutWay { @Override public void goOut() { System.out.println("開汽車"); } } public class BusWay implements IOutWay { @Override public void goOut() { System.out.println("做公交車"); } }
- 定義上下文,封裝出行方式,呼叫其出行方法。
public class OutContext { private IOutWay outWay; public OutContext(IOutWay outWay) { this.outWay = outWay; } public void setOutWay(IOutWay outWay) { this.outWay = outWay; } public void go2Work() { outWay.goOut(); } }
- 測試。
public class StrategyTest { public static void main(String[] args) { OutContext outContext = new OutContext(new CarWay()); outContext.go2Work(); outContext.setOutWay(new BusWay()); outContext.go2Work(); } }
5. 優缺點
1. 優點:
易於擴充套件,對「開閉原則」完美支援,在不修改原有系統的基礎上,可以更換演算法或者增加新的演算法,提高了程式碼的複用性,是一種替換繼承,避免多重條件轉移語句的實現方式。
2. 缺點:
客戶端必須知道所有的策略類,並理解其區別,同時在一定程度上增加了系統中類的個數,可能會存在很多策略類。
3. 使用場景:
在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為;一個系統需要動態地在幾種演算法中選擇一種;避免使用難以維護的多重條件選擇語句。
【附錄】

資料圖