【设计模式与Android】策略模式——锦囊里的上策中策下策

什么是策略模式

石楼网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。

 

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

 

策略模式的实现方式

 

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

public classLiuBei {

    IStrategyiStrategy;

    public voidsetiStrategy(IStrategy iStrategy) {
        this.iStrategy= iStrategy;
    }

    publicString dispatch(String... generals){
        returniStrategy.dispatch(generals);
    }

}

 

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

public interfaceIStrategy {

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

}

 

上计:

public classGoodStrategyimplementsIStrategy {
    @Override
    publicString dispatch(String... generals) {
        String goodStrategy ="派";

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

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

        returngoodStrategy;
    }
}

 

中计:

public classMiddleStrategyimplementsIStrategy {
    @Override
    publicString dispatch(String... generals) {
        String middleStrategy ="派";

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

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

        returnmiddleStrategy;
    }
}

 

下计:

public classBadStrategyimplementsIStrategy {
    @Override
    publicString dispatch(String...generals) {
        String badStrategy ="派";

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

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

        returnbadStrategy;
    }
}

 

刘备选择了中计:

LiuBei liuBei =newLiuBei();
liuBei.setiStrategy(newMiddleStrategy());
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】备忘录模式——在齐太史简


网页名称:【设计模式与Android】策略模式——锦囊里的上策中策下策
文章网址:http://ybzwz.com/article/jphess.html