什么是策略模式

 

所谓策略模式,就是定义一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换的设计模式。策略模式让算法独立于使用它的用户而独立变化。一般用于同类问题的不同处理方式或者选择同一抽象类的不同子类的时候。

 

策略模式的实现方式

 

现在已经没人怀疑我是文科生了,我写代码继续以文学举例。《三国演义》第六十二回中刘璋和刘备撕破脸皮后,庞统给刘备制定了三条策略——上计、中计和下计。我们先写一个决策者刘备类:

public class LiuBei {

    IStrategy iStrategy;

    public void setiStrategy(IStrategy iStrategy) {
        this.iStrategy = iStrategy;
    }

    public String dispatch(String... generals){
        return iStrategy.dispatch(generals);
    }

}

 

我们再指定一个抽象的策略接口:

public interface IStrategy {

    /**
     * 派遣将军执行计划
     * @param generals 将军
     * @return
     */
    String dispatch(String... generals);

}

 

上计:

public class GoodStrategy implements IStrategy {
    @Override
    public String dispatch(String... generals) {
        String goodStrategy = "派";

        for (String general:generals){
            goodStrategy += ("、" + general);
        }

        goodStrategy = goodStrategy.replaceFirst("、","");
        goodStrategy += "只今便选精兵,昼夜兼道径袭成都";

        return goodStrategy;
    }
}

 

中计:

public class MiddleStrategy implements IStrategy {
    @Override
    public String dispatch(String... generals) {
        String middleStrategy = "派";

        for (String general:generals){
            middleStrategy += ("、" + general);
        }

        middleStrategy = middleStrategy.replaceFirst("、","");
        middleStrategy += "先取涪城,然后却向成都";

        return middleStrategy;
    }
}

 

下计:

public class BadStrategy implements IStrategy {
    @Override
    public String dispatch(String... generals) {
        String badStrategy = "派";

        for (String general:generals){
            badStrategy += ("、" + general);
        }

        badStrategy = badStrategy.replaceFirst("、","");
        badStrategy += "退还白帝,连夜回荆州,徐图进取";

        return badStrategy;
    }
}

 

刘备选择了中计:

LiuBei liuBei = new LiuBei();
liuBei.setiStrategy(new MiddleStrategy());
Log.e("玄德犹有不忍之心",liuBei.dispatch("黄忠","魏延"));

 

预知后事如何,请看本系列文章第一篇的举例分解。

 

Android源码中的策略模式

 

(1)TypeEvaluator

研究自定义控件的Android工程师应该都用过ValueAnimator,那么对ValueAnimator的setEvaluator(TypeEvaluator value)方法一定不陌生,其中TypeEvaluator接口被RectEvaluator和FloatEvaluator等多个类引用。这就是一个典型的策略模式。

 

Android开发中如何利用策略模式

 

(1)策略模式最主要的用途是分离算法,当针对同一类问题的多种处理方式仅是具体行为有差别可能产生大量不易维护的多分支语句(if-else或switch-case)的时候适合使用策略模式。常见的应用场景比如电商App对购物车中商品每次结算金额的不同优惠券、折扣和邮费策略等。

 

需要注意的几个问题

 

1) 因为每个具体策略都会产生一个新策略类,所以会增加系统需要维护的类的数量。

 

2)在基本的策略模式中,选择所用具体实现的职责由客户端对象承担。换句话说就是策略模式只适用于客户端知道算法或行为的情况。


本系列其他博客


【设计模式与Android】状态模式——一个人的两幅面孔


【设计模式与Android】责任链模式——曹瞒兵败走华容


【设计模式与Android】命令模式——军令如山


【设计模式与Android】观察者模式——千里眼与顺风耳


【设计模式与Android】备忘录模式——在齐太史简



更多相关文章

  1. TextView在显示文字的时候有个问题就是一行还没显示满就跳到下一
  2. Android理解四种启动模式
  3. State 状态模式在 Android(安卓)多弹窗的应用
  4. Android之“观察者模式”解析及实际应用:"应用宝"软件下载中 进度
  5. 微软打击 Android(安卓)不过是历史重演
  6. 关于Android的Sensor驱动,不支持内核模块模式的驱动
  7. android微信聊天记录导出到电脑【微信安卓版技巧】
  8. 【设计模式二之Builder模式】设计模式的Builder模式[结合使用And
  9. android没有告诉你的usr模式和eng模式的区别

随机推荐

  1. Android优化和性能
  2. Android进程回收
  3. eclipse中Android布局的基本操作
  4. Android SlidingDrawer 滑动抽屉效果
  5. android 让Launcher Hotseat中的图标显示
  6. Android View And Activity
  7. Android(安卓)ArrayList LinkedList Set
  8. 10个精品Android(安卓)主题下载
  9. android 5.0之后利用Intent传递Serializa
  10. Android(安卓)开发 之 异常android.os.Fi