NeilZhang

策略模式基础讲解已经很详尽:

  https://www.cnblogs.com/lewis0077/p/5133812.html

补充使用实例:网络请求重试策略

策略接口:

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 函数即可。

 

相关文章:

  • 2019-11-10
  • 2019-01-22
  • 2021-12-12
猜你喜欢
  • 2020-03-18
  • 2021-08-06
  • 2021-08-06
  • 2021-12-08
相关资源
相似解决方案