设计模式(11)-策略模式详解(易懂)

策略模式的定义

策略模式比较简单,是指对一系列的算法定义,并将每个算法封装起来,并且使它们还能够相互替换。策略模式让算法独立于使用它的客户而独立变化。算法

模型:微信

image

  • Context:上下文角色,起到封装的做用,持有一个Strategy对象的引用
  • Strategy:策略角色(抽象) 一般为接口
  • ConcreteStrategy:具体的策略角色

实例说明

策略模式很好理解,这里拿百度网盘举例你们应该更明白了。好比如今的百度网盘普通的用户没有额外的空间,会员会额外的得到2T空间 ,而超级会员额外得到5T空间+各类福利。这也是一种策略,下面用代码演示一下:ide

1.Strategy,抽象的策略,也就是获取的额外的空间this

public interface AbstractStrategy {
    //获取额外空间的方法
    public  void  getExSpace();
}

2.ConcreteStrategy,也就是普通用户,会员,超级会员spa

public class OrdinaryUser implements AbstractStrategy{

    @Override
    public void getExSpace() {
        Log.d("qzs","普通用户没有额外的空间获取");
    }
}
public class Vip implements AbstractStrategy {
    @Override
    public void getExSpace() {
        Log.d("qzs","会员用户有2T额外的空间获取");
    }
}
public class SuperVip implements AbstractStrategy {
    @Override
    public void getExSpace() {
        Log.d("qzs","超级会员用户有5T额外的空间获取");
    }
}

3.Context,上下文,为了封装code

public class SpaceContext {
    private  AbstractStrategy abstractStrategy;

    public  SpaceContext(AbstractStrategy abstractStrategy){
        this.abstractStrategy=abstractStrategy;
    }
    //调用抽象策略角色中的方法
    public void getExSpace(){
        this.abstractStrategy.getExSpace();
    }
}

4.调用:对象

SpaceContext spaceContext;
        //若是是普通用户
        spaceContext=new SpaceContext(new OrdinaryUser());
        spaceContext.getExSpace();
        //若是是会员
        spaceContext=new SpaceContext(new Vip());
        spaceContext.getExSpace();
        //若是是超级会员
        spaceContext=new SpaceContext(new SuperVip());
        spaceContext.getExSpace();

运行结果:接口

image

策略模式的优缺点及其余

1.优势ip

  • 策略模式提供了管理相关的算法族的办法,算法能够切换
  • 避免使用多重条件转移语句

2.缺点rem

  • 客户端知道全部的策略类,并自行决定使用哪个策略类。策略类完成暴露了
  • 策略类有时会很是多

3.适用场景

  • 多个类只区别在表现行为不一样,可使用Strategy模式,在运行时动态选择具体要执行的行为。
  • 须要在不一样状况下使用不一样的策略(算法),或者策略还可能在将来用其它方式来实现。
  • 对客户隐藏具体策略(算法)的实现细节,彼此彻底独立。

强调:策略模式在Android中的应用比较典型是Adapter;另外还有策略枚举的应用你们感兴趣的能够本身看一下;具体的应用我会另外写一篇文章来说。

定义和优缺点参考网上信息


另外能够加入个人Android技术交流群:458739310
你们能够关注个人微信公众号:「安卓干货铺」一个有质量、有态度的公众号!

相关文章
相关标签/搜索