【java】使用Builder模式,轻松应对动态繁杂的方法参数

背景:在咱编写的图片处理模块里,针对加载这个方法,参数很多,如:

/**
     * 加载图片,经过内存、磁盘、两层缓存如果还没找到,则走http访问网络资源
     * @param url 地址
     * @param imageView 图片控件
     * @param width 图片宽度
     * @param height 图片高度
     * @param cacheType 缓存类型
     * @param workType 队列优先级
     * @param placeHolder 占位图片
     * @param canQueryHttp 是否可以走流量获取图片
     */
    private void load(String url, ImageView imageView, int width, int height, CacheType cacheType, ImageTaskManager.WorkType workType, int placeHolder, boolean canQueryHttp) {

}

咱们当然可以用 重载 提供很多个版本,应付项目里面的需要。

但是我们可以用Builder(构造器)模式,提供一种更加优雅易用的访问方式。

事实上,很多android上优秀的开源图片框架都用了这种方式,如picassouniversalImageLoader

先给上优化后,咱们调用加载方法的方式:

 ZImage.ready().want(entity.getIconUrl()).reSize(mImgSize, mImgSize).into(newsIcon);

全部的参数如下:

ZImage.ready().want("请求地址").reSize(图片尺寸).cache(缓存方式).canQueryByHttp(是否可以走流量访问图片).lowPriority(将请求放到栈的底部).empty(图片占位符).into(图片控件);

 接下来简单说下,咱是如何简单用构造器模式重构图片功能模块的:

1:新建一个类RequestCreator, 将load方法的参数抽取出来作为其属性

2:针对每个属性的赋值方法,返回this,这样就可以保证每次赋值后,可以获得对象继续赋值

        /**
         * 缓存
         *
         * @param cacheType 缓存类型
         * @return
         */
        public RequestCreator cache(CacheType cacheType) {
            this.cacheType = cacheType;
            return this;
        }

3:增加一个方法,将类里面的属性,作为参数传递到load方法里

 /**
         * 载入图片到控件
         *
         * @param imageView
         */
        public void into(ImageView imageView) {
            mZImage.load(url, imageView, width, height, cacheType, priority, placeHolder, canQueryByHttp);
        }

4:在现有图片功能类里面,添加一个want方法,返回RequestCreator。

 /**
     * 构造器起手式,从一个资源开始
     *
     * @param url
     * @return
     */
    public RequestCreator want(String url) {
        return new RequestCreator(url);
    }

给上完整的构造器的类,各位可以参考下,完整的图片模块请参考本人的项目源码

 /**
     * 请求构造器
     */
    public class RequestCreator {
        /**
         * 请求地址
         */
        String url;

        /**
         * 优先级,默认后进先出
         */
        ImageTaskManager.WorkType priority = ImageTaskManager.WorkType.LIFO;

        /**
         * 占位图
         */
        int placeHolder = -1;

        /**
         * 缓存类型,默认内存缓存,基于LRU算法,不用担心内存爆炸
         */
        CacheType cacheType = CacheType.DiskMemory;

        /**
         * 图片的宽度
         */
        int width = mBaseApp.getScreenWidth();

        /**
         * 图片的高度
         */
        int height = mBaseApp.getScreenHeight();

        /**
         * 能否通过http请求网络数据
         */
        boolean canQueryByHttp = true;

        public RequestCreator(String url) {
            this.url = url;
            this.canQueryByHttp = mBaseApp.canRequestImage();
        }

        /**
         * 占位图
         *
         * @param resID 本地图片资源 R.drawable.
         * @return
         */
        public RequestCreator empty(int resID) {
            placeHolder = resID;
            return this;
        }

        /**
         * 缓存
         *
         * @param cacheType 缓存类型
         * @return
         */
        public RequestCreator cache(CacheType cacheType) {
            this.cacheType = cacheType;
            return this;
        }

        /**
         * 优先级,默认后进先出。使用本方法降低优先级
         *
         * @return
         */
        public RequestCreator lowPriority() {
            priority = ImageTaskManager.WorkType.LILO;
            return this;
        }

        /**
         * 对图片尺寸进行缩放,节约内存
         *
         * @param width  图片宽度,默认屏幕宽度
         * @param height 图片高度,默认屏幕高度
         * @return
         */
        public RequestCreator reSize(int width, int height) {
            this.width = width;
            this.height = height;
            return this;
        }

        public RequestCreator canQueryByHttp(boolean canQueryByHttp) {
            this.canQueryByHttp = canQueryByHttp;
            return this;
        }

        /**
         * 载入图片到控件
         *
         * @param imageView
         */
        public void into(ImageView imageView) {
            mZImage.load(url, imageView, width, height, cacheType, priority, placeHolder, canQueryByHttp);
        }

        /**
         * 下载图片
         */
        public void save() {
            if (DBHelper.cache().exist(url))
                return;

            ImageTaskManager.getInstance().addTask(new SaveImageTask(mBaseApp, url, width, height), priority);
        }
    }
原文地址:https://www.cnblogs.com/kimmy/p/4778446.html