策略模式基礎講解已經很詳盡:
https://www.cnblogs.com/lewis0077/p/5133812.html
補充使用實例1:網絡請求重試策略
策略接口:
public interface RetryPolicy { int getMaxNumRetries(); void setmMaxNumRetries(int mMaxNumRetries); /** * 重試策略的具體執行:可以根據不同的RequestException作不同的重試 */ boolean retry(RequestException e) ; }
抽象類
public abstract class AbstractRetryPolicy implements RetryPolicy{ //當前重試次數 protected int mCurrentRetryCount; //最大重試次數 protected int mMaxNumRetries; //默認的最大重試次數 public static final int DEFAULT_MAX_RETRIES = 1; public AbstractRetryPolicy() { this(DEFAULT_MAX_RETRIES); } public AbstractRetryPolicy(int maxNumRetries) { mMaxNumRetries = maxNumRetries; } /** * 獲取最大重試冊書 * @return */ public int getMaxNumRetries() { return mMaxNumRetries; } /** * 設置最大重試次數 * @param mMaxNumRetries */ public void setmMaxNumRetries(int mMaxNumRetries) { this.mMaxNumRetries = mMaxNumRetries; } }
默認重試策略的實現:
public class DefaultRetryPolicy extends AbstractRetryPolicy { public DefaultRetryPolicy() { } public DefaultRetryPolicy(int maxNumRetries) { super(maxNumRetries); } /** * 重試策略的具體執行 * @param e * @return */ @Override public boolean retry(RequestException e) { mCurrentRetryCount++; return checkRetry(); } /** * 檢測重試次數是否達到最大重試次數 * @return */ protected boolean checkRetry() { return mCurrentRetryCount <= mMaxNumRetries; } }
業務請求實體中會包含一個 RetryPolicy 對象,當需要判斷是否需要重試時只需要調用該對象的 retry 函數即可。
補充使用實例2:網絡請求返回數據解析
在封裝網絡請求時,需要對遠端返回的數據進行解析,但是封裝層並不知道數據的結構以及業務端需要的數據。這裏可以運用策略模式,抽象原始數據解析接口,業務希望對數據進行不同的解析(加密、壓縮),返回一個泛型類。