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

一卷旌收千骑虏,万全身出百重围。这篇文章主要讲述设计模式与Android策略模式——锦囊里的上策中策下策相关的知识,希望能为你提供帮助。
什么是策略模式
 
所谓策略模式,就是定义一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换的设计模式。策略模式让算法独立于使用它的用户而独立变化。一般用于同类问题的不同处理方式或者选择同一抽象类的不同子类的时候。
 
策略模式的实现方式
 
现在已经没人怀疑我是文科生了,我写代码继续以文学举例。《三国演义》第六十二回中刘璋和刘备撕破脸皮后,庞统给刘备制定了三条策略——上计、中计和下计。我们先写一个决策者刘备类:

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;
        }
}
 
【设计模式与Android策略模式——锦囊里的上策中策下策】下计:
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)在基本的策略模式中,选择所用具体实现的职责由客户端对象承担。换句话说就是策略模式只适用于客户端知道算法或行为的情况。


本文出自 “玖哥的书房” 博客,请务必保留此出处http://dongfeng9ge.blog.51cto.com/9191243/1973066

    推荐阅读