定义
-
属于设计模式中行为模式的一种
-
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开发,委派给不同的对象管理。使得算法可独立于使用它的客户而独立变化。
UML类图
策略模式UML图.png角色解释
- Strategy(抽象策略类):接口或者抽象类,内部提供了具体的策略类需要实现方法。
- StrategyA、StrategyB(具体的策略类):实现抽象策略类实现具体的方法,封装相关算法。
- Context(环境类):用来操作策略的上下环境
具体使用
- 以加载图片为例子,Android中有Glide、Picasso、Fresco众多优秀的图片加载框架,我们为了能灵活切换不同的加载框架,我们可以使用策略模式
创建抽象策略类(IImageStragety)
public interface IImageStragety{
void onLoadImage(String url);
}
创建具体的策略类
-
GlideLoadImageStragety
public class GlideLoadImageStragety implements IImageStragety{ @Override public void onLoadImage(String url){ //实际中这里封装的是调用Glide加载图片 Log.d("load_image","Glide load image") } }
-
PicassoLoadImageStragety
public class PicassoLoadImageStragety implements IImageStragety{ @Override public void onLoadImage(String url){ Log.d("load_image","Picasso load image") } }
创建环境类
public class ImageLoadContext{
private volatite static IImageLoadStragety mImageLoadStragety;
private ImageLoadContext(){
//默认使用Glide的加载框架
mImageLoadStragety = GlideLoadImageStragety();
}
public static IImageLoadStragety getInstance(){
return ImageLoadHolder.INSTANCE;
}
/**
* 用于设置图片框架
*/
public void setImageStragety(IImageStragety imageLoadStragety){
mImageLoadStragety = imageLoadStragety;
}
public void loadImage(String url){
mImageLoadStragety.onLoadImage(url);
}
/**
* 静态内部类的形式,创建ImageLoadContext实例
*/
private static class ImageLoadHolder{
priavte static final ImageLoadContext INSTANCE = new ImageLoadContext()
}
}
使用场景
- 当一个问题可以有不同的算法时,并且仅仅是算法的具体实现细节不同,那么可以使用策略模式。
优点
- 可以灵活切换不同的策略实现类,这些具体策略实现类都实现相同的接口,可以互相切换。
- 耦合度低,方便扩展:当要新增一个策略类的时候仅需要实现接口,书写对应的算法,不需要改动上层业务逻辑中的代码。
缺点
- 要创建多个具体策略实现类
网友评论