策略模式(Strategy Pattern)- 最易懂的設計模式解析
前言
今天我來全面總結一下Android開發中最常用的設計模式 -策略模式。
目錄

1.jpg
1. 介紹
1.1 定義
定義一系列演算法,將每個演算法封裝到具有公共介面的一系列策略類中,從而使它們可以相互替換 & 讓演算法可在不影響客戶端的情況下發生變化
簡單來說:準備一組演算法 & 將每一個演算法封裝起來,讓外部按需呼叫 & 使得互換
1.2 作用(解決的問題)
將演算法的責任和本身進行解耦,使得:
- 演算法可獨立於使用外部而變化
- 客戶端方便根據外部條件選擇不同策略來解決不同問題
策略模式僅僅封裝演算法(包括新增 & 刪除),但策略模式並不決定在何時使用何種演算法,演算法的選擇由客戶端來決定
2. 模式原理
2.1 UML類圖 & 組成

944365-b983c25bafaf8ca8.png
2.2 例項講解
接下來我用一個例項來對策略模式進行更深一步的介紹。
a. 例項概況
背景:小成有一家百貨公司,最近在定年度的促銷活動
衝突:每個節日用同一個促銷活動太枯燥,沒吸引力
解決方案:針對不同節目使用不同促銷活動進行促銷
b. 使用步驟
步驟1: 定義抽象策略角色(Strategy):百貨公司所有促銷活動的共同介面
public abstract class Strategy { public abstract void Show(); }
步驟2:定義具體策略角色(Concrete Strategy):每個節日具體的促銷活動
//為春節準備的促銷活動A class StrategyA extends Strategy{ @Override public void show() { System.out.println("為春節準備的促銷活動A"); } } //為中秋節準備的促銷活動B class StrategyB extends Strategy{ @Override public void show() { System.out.println("為中秋節準備的促銷活動B"); } } //為聖誕節準備的促銷活動C class StrategyC extends Strategy{ @Override public void show() { System.out.println("為聖誕節準備的促銷活動C"); } }
步驟3:定義環境角色(Context):用於連線上下文,即把促銷活動推銷給客戶,這裡可以理解為銷售員
class Context_SalesMan{ //持有抽象策略角色的引用 private Strategy strategy; //生成銷售員例項時告訴銷售員什麼節日(構造方法) //使得讓銷售員根據傳入的引數(節日)選擇促銷活動(這裡使用一個簡單的工廠模式) public SalesMan(String festival) { switch ( festival) { //春節就使用春節促銷活動 case "A": strategy = new StrategyA(); break; //中秋節就使用中秋節促銷活動 case "B": strategy = new StrategyB(); break; //聖誕節就使用聖誕節促銷活動 case "C": strategy = new StrategyC(); break; } } //向客戶展示促銷活動 public void SalesManShow(){ strategy.show(); } }
步驟4:客戶端呼叫-讓銷售員進行促銷活動的落地
public class StrategyPattern{ public static void main(String[] args){ Context_SalesMan mSalesMan ; //春節來了,使用春節促銷活動 System.out.println("對於春節:"); mSalesMan =Context_SalesMan SalesMan("A"); mSalesMan.SalesManShow(); //中秋節來了,使用中秋節促銷活動 System.out.println("對於中秋節:"); mSalesMan =Context_SalesMan SalesMan("B"); mSalesMan.SalesManShow(); //聖誕節來了,使用聖誕節促銷活動 System.out.println("對於聖誕節:"); mSalesMan =Context_SalesMan SalesMan("C"); mSalesMan.SalesManShow(); } }
結果輸出
對於春節: 為春節準備的促銷活動A 對於中秋節: 為中秋節準備的促銷活動B 對於聖誕節: 為聖誕節準備的促銷活動B
通過上述這個常見的生活例子,我相信你已經完全明白了策略模式的原理了!!
3. 優缺點
在全面解析完後,我來分析下其優缺點:
3.1 優點
- 策略類之間可以自由切換
由於策略類都實現同一個介面,所以使它們之間可以自由切換。 - 易於擴充套件
增加一個新的策略只需要新增一個具體的策略類即可,基本不需要改變原有的程式碼,符合“開閉原則“ - 避免使用多重條件選擇語句(if else),充分體現面向物件設計思想。
3.2 缺點
- 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。
- 策略模式將造成產生很多策略類,可以通過使用享元模式在一定程度上減少物件的數量。
4. 應用場景
動態選擇多種複雜行為
該行為可理解為:
- 複雜的演算法 / 資料結構
- 類的行為 / 方法
注:提高了行為的保密 & 阿暖