什么是策略模式算法
所谓策略模式,就是定义一系列的算法,并将每个算法封装起来,并且使它们能够相互替换的设计模式。策略模式让算法独立于使用它的用户而独立变化。通常用于同类问题的不一样处理方式或者选择同一抽象类的不一样子类的时候。设计模式
策略模式的实现方式ide
如今已经没人怀疑我是文科生了,我写代码继续以文学举例。《三国演义》第六十二回中刘璋和刘备撕破脸皮后,庞统给刘备制定了三条策略——上计、中计和下计。咱们先写一个决策者刘备类:this
public class LiuBei {
IStrategy iStrategy;
public void setiStrategy(IStrategy iStrategy) { this.iStrategy = iStrategy; }
public String dispatch(String... generals){ return iStrategy.dispatch(generals); }
}lua |
咱们再指定一个抽象的策略接口:spa
public interface IStrategy {
/** * 派遣将军执行计划 * @param generals 将军 * @return */ String dispatch(String... generals);
}设计 |
上计:orm
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; } }对象 |
中计:blog
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】备忘录模式——在齐太史简