废话一下
看设计模式已经很久了,感觉自己也多少有些体会,这次我将从代码的角度去分析设计模式,将自己的一些理解记录分享一下。我将从策略模式出发,一步步将代码演化成其他设计模式,这将是一个比较有趣的过程,希望能够对读者有所帮助。废话少说,我们直接进入正题
策略模式
1、定义:
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换
怎么来理解它呢?就是说我要去完成一件事,有多种方式、途径,那么我把每种方式都封装起来,提供统一的接口,那么我就可以随意切换每种方式。下面我们来举个例子:
在android中图片加载框架比较多,每一种框架都可以实现加载图片,但是有时候我们需要更换框架这就比较麻烦了,我们这里就用策略模式来对这些框架进行一些封装
2、步骤
a. 定义一个ImageLoader接口
public interface ImageLoader {
void load(String url);
}
b. 用glide来实现图片加载
public class GlideImageLoader implements ImageLoader {
@Override
public void load(String url) {
//这里实现具体的逻辑
//Glide.with(context).into(imageView)
}
}
c. 用fresco来实现图片加载
public class FrescoImageLoader implements ImageLoader {
@Override
public void load(String url) {
//实现具体的逻辑
//simpleDraweeView.setImageUri(url)
}
}
d.定义一个ImageLoaderManager
public class ImageLoaderManager {
private ImageLoader imageLoader;
public ImageLoaderManager(ImageLoader imageLoader) {
this.imageLoader = imageLoader;
}
public void loadImage(String url){
//将图片加载转交给ImageLoader的实现类来操作
if (imageLoader!=null) {
imageLoader.load(url);
}
}
}
e.测试类
public class Test {
public static void main(String[] args){
GlideImageLoader glideImageLoader=new GlideImageLoader();
//FrescoImageLoader frescoImageLoader=new FrescoImageLoader();
ImageLoaderManager imageLoaderManager=new ImageLoaderManager(glideImageLoader);
imageLoaderManager.loadImage("url");
}
}
如此这般 我们就可以随意修改所使用的图片加载框架了,这就是策略模式
f.分析
首先,这里算法可以自由切换,
也就是说图片加载框架我可以以极小的代价去更换他,而不会影响我使用的地方;
其次,扩展性良好,当我想增加一种图片加载的方式时,
我只需要实现ImageLoader接口,替换ImageLoader即可
关注点
策略模式的关注点是什么?是算法/方式的无缝替换,强调的是多种自主的实现及替换