设计模式——策略模式

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

  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:网络请求返回数据解析

在封装网络请求时,需要对远端返回的数据进行解析,但是封装层并不知道数据的结构以及业务端需要的数据。这里可以运用策略模式,抽象原始数据解析接口,业务希望对数据进行不同的解析(加密、压缩),返回一个泛型类。

原文地址:https://www.cnblogs.com/NeilZhang/p/10208399.html