zoukankan      html  css  js  c++  java
  • 设计模式——策略模式

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

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

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

  • 相关阅读:
    CURL常用命令
    极客无极限 一行HTML5代码引发的创意大爆炸
    JS的prototype和__proto__(含es6的class)
    leetcode 44:construct-binary-tree-from-preorder-and-inorder
    leetcode 43:construct-binary-tree-from-inorder-and-postorder
    leetcode 42:binary-tree-level-order-traversal-ii
    leetcode 38:path-sum
    leetcode 37:path-sum-ii
    leetcode 33:pascals-triangle
    leetcode 32:pascals-triangle-ii
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/10208399.html
Copyright © 2011-2022 走看看