举例情景
实现一个功能有多种方法和策略,我们可以根据不同的情况选择不同的策略,具体一点,比如
- 电子书阅读的多种动画
- 文件浏览器的文件多种排列方式
- 又或者是多种算法
通常做法
一般情况下,我们处理以上的情况时在一个类中实现多种算法,通过不同的命名来区分,调用。
这样做的缺点
- 一个类中实现多种算法,不符合单一职责
- 实现具体的算法需要调用具体方法,还会产生多个if else,容易误判,导致逻辑错误
- 新增方法需要修改代码,有可能改变原有的逻辑结构,不符合对外开放,对内闭合的原则
我们应该怎么做
将算法或者策略抽出来,提供统一接口,不同算法或者不同策略有不同的实现方法,通过动态注入选择策略或者算法,可维护,可扩展性高
适用范围
- 针对同一问题有多种解决办法,仅仅是具体的行为有所差异
- 需要封装多种同一类型的操作
- 一个父类有多个子类,并且需要使用多重if else 或者switch case 时
举例
ImageLoader的加载策略
public class ImageLoader(){
private ICatetgrey mCategrey;
//其他代码省略
public void setCategrey(ICatetgrey categrey){
this.mCategrey=categrey;
}
}
接口,公有方法
public interface ICategrey{
Bitmap getBitmap(String name);
void putBitmap(String name,Bitmap bitmap);
}
内存缓存
public class LruCache implements ICategrey{
@Override
public Bitmap getBitmap(String name){
//略
}
@Override
public void putBitmap(String name,Bitmap bitmap){
//略
}
}
硬盘缓存
public class DiskLruCache implements ICategrey{
@Override
public Bitmap getBitmap(String name){
//略
}
@Override
public void putBitmap(String name,Bitmap bitmap){
//略
}
}
使用,可以在硬盘缓存和内存缓存中进行选取
ImageLoader imageLoader=new ImageLoader();
imageLoader.setCategrey(new LruCache());
//imageLoader.setCategrey(new DiskLruCache());