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

设计模式-策略模式

作者: 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