什么是策略模式

 

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

 

策略模式的实现方式

 

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

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】备忘录模式——在齐太史简