美文网首页
设计模式-策略模式

设计模式-策略模式

作者: dashingqi | 来源:发表于2020-09-12 17:41 被阅读0次

定义

  • 属于设计模式中行为模式的一种

  • 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开发,委派给不同的对象管理。使得算法可独立于使用它的客户而独立变化。

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()
  }
}

使用场景

  • 当一个问题可以有不同的算法时,并且仅仅是算法的具体实现细节不同,那么可以使用策略模式。

优点

  • 可以灵活切换不同的策略实现类,这些具体策略实现类都实现相同的接口,可以互相切换。
  • 耦合度低,方便扩展:当要新增一个策略类的时候仅需要实现接口,书写对应的算法,不需要改动上层业务逻辑中的代码。

缺点

  • 要创建多个具体策略实现类

相关文章

网友评论

      本文标题:设计模式-策略模式

      本文链接:https://www.haomeiwen.com/subject/yegwektx.html