安卓设计模式(六)策略模式

作者: uncochen | 来源:发表于2016-11-27 17:58 被阅读293次

    策略模式提供了一种非常好的解耦方式,使我们的代码符合单一职责原则和开闭原则;策略模式在Android中使用的比较多,是一种很好理解的设计模式;

    该系列其他文章:

    定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化

    使用场景:

    • 同一操作有多种实现方式,且可能有更换的需求
    • 需要封装多种同类型操作
    • 基于继承体系,有多个实现子类,需要使用if-else判断时

    具体实现

    这里举一个例子,在Androd中有很多图片加载框架,如Picasso-Glide-UniversalImageLoader等等,这些框架的功能就是图片加载及缓存,功能相同但是内部实现却是不同的,各有千秋;在项目开发中,有可能需要更换图片加载框架,如果前期我们使用了策略模式设计,那么更换框架将非常平滑且优雅.OK,这里基于策略模式和Builder模式来封装这个功能:

    图片加载抽象:

    /**
     * ===============================
     *
     * @Action : 图片加载接口,定义图片加载的方法,如果需要更换图片加载的框架,实现该接口即可
     * @Time : 2016/10/4 22:29
     *
     * ===============================
     */
    public interface ImageLoaderClient {
        /**
         * 正常加载图片
         */
        void loadImage(Context context, ImageView view, String url, int placePicRes, int errorPicRes);
    
        /**
         * 先展示缩略图,加载完成展示原图
         */
        void loadImage(Context context, ImageView view, String url, int placePicRes, int errorPicRes, float thumbnail);
    } 
    

    具体加载器

    /**
     * ===============================
     *
     * @Author: 陈振
     * @Email : 15629079270@163.com
     * @Action : 使用glide进行图片加载的实例
     * @Time : 2016/10/4 22:29
     *
     * ===============================
     */
    public class GlideClient implements ImageLoaderClient {
    
        @Override
        public void loadImage(Context context, ImageView view, String url, int placePicRes, int errorPicRes) {
            Glide.with(context).load(url).placeholder(placePicRes).error(errorPicRes).into(view);
        }
    
        @Override
        public void loadImage(Context context, ImageView view, String url, int placePicRes, int errorPicRes, float
                thumbnail) {
            Glide.with(context).load(url).placeholder(placePicRes).error(errorPicRes).thumbnail(thumbnail).into(view);
        }
    }
    

    使用

    public class IApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            ImageLoaderConfig loaderConfig = new ImageLoaderConfig.Builder()
                    .client(new GlideClient())//设置加载器
                    .placePicRes(R.mipmap.placeholder)//占位图
                    .errorPicRes(R.mipmap.placeholder)//错误图
                    .interceptor(new DefaInterceptor())//设置拦截器
                    .build();
            ImageLoaderHelper.init(loaderConfig);//初始化CommonImageLoader
        }
    }
    

    如果需要更换其他加载框架,实现ImageLoaderClient接口,传入不同的加载器实例即可:

    .client(new PicassoClient())//设置加载器
    

    分析

    策略模式非常好理解,由上面可以看出我们的程序对单一图片加载框架依赖降低,低耦合,由于可以平滑更换具体实现,提高了程序的可扩展性.所以策略模式是一个好理解又能快速提高代码质量的设计模式

    代码地址请戳:commonimageloader

    关于作者

    相关文章

      网友评论

        本文标题:安卓设计模式(六)策略模式

        本文链接:https://www.haomeiwen.com/subject/imjnpttx.html