策略模式基础讲解已经很详尽:
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:网络请求返回数据解析
在封装网络请求时,需要对远端返回的数据进行解析,但是封装层并不知道数据的结构以及业务端需要的数据。这里可以运用策略模式,抽象原始数据解析接口,业务希望对数据进行不同的解析(加密、压缩),返回一个泛型类。