設計模式——策略模式

策略模式基礎講解已經很詳盡:

  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:網絡請求返回數據解析

在封裝網絡請求時,需要對遠端返回的數據進行解析,但是封裝層並不知道數據的結構以及業務端需要的數據。這裏可以運用策略模式,抽象原始數據解析接口,業務希望對數據進行不同的解析(加密、壓縮),返回一個泛型類。

 

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