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

策略模式提供了一种非常好的解耦方式,使我们的代码符合单一职责原则和开闭原则;策略模式在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

关于作者

    原文作者:uncochen
    原文地址: https://www.jianshu.com/p/7701beed4f37
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞