zoukankan      html  css  js  c++  java
  • 【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);
            }
        }
  • 相关阅读:
    CentOS 6.3用ssh无密码登陆其它主机
    堆排序算法以及JAVA实现
    TaskTracker发送Heartbeat以及接受HeartbeatResponse
    Linux常用命令总结
    用eclipse将mapreduce程序打成jar包并在命令行执行
    jquery自定义验证方法
    solaris中几个网络经典命令小结
    DWR的简单总结[转]
    java 编码问题 及转换
    DWR学习详解【转】
  • 原文地址:https://www.cnblogs.com/kimmy/p/4778446.html
Copyright © 2011-2022 走看看