策略模式提供了一种非常好的解耦方式,使我们的代码符合单一职责原则和开闭原则;策略模式在Android中使用的比较多,是一种很好理解的设计模式;
该系列其他文章:
- 安卓设计模式(一)面向对象六大设计原则
- 安卓设计模式(二)单例模式
- 安卓设计模式(三)Builder模式
- 安卓设计模式(四)装饰者模式
- 安卓设计模式(五)代理模式
- 安卓设计模式(六)策略模式
- 安卓设计模式(七)模板方法模式
- 安卓设计模式(八)工厂方法模式
定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化
使用场景:
- 同一操作有多种实现方式,且可能有更换的需求
- 需要封装多种同类型操作
- 基于继承体系,有多个实现子类,需要使用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
}
}
如果需要更换其他加载框架,实现ImageLoaderClien
t接口,传入不同的加载器实例即可:
.client(new PicassoClient())//设置加载器
分析
策略模式非常好理解,由上面可以看出我们的程序对单一图片加载框架依赖降低,低耦合,由于可以平滑更换具体实现,提高了程序的可扩展性.所以策略模式是一个好理解又能快速提高代码质量的设计模式
代码地址请戳:commonimageloader
关于作者
- 简 书:uncochen
- github:ChenZhen
- 新浪微博:@Chen丶振
- Email:18620156376@163.com