模式介绍
开发中可能有这样的情况: 实现某一个功能可以有多中算法或者策略, 我们根据不同的功能来选择不同的算法. 针对这种情况,
1.可以在一个类中封装多个方法, 每个方法实现不同算法.
2.通过 if..else if..else.. 条件判断来决定使用哪种算法. 但是这两种都是 硬编码 实现. 并且随着算法的增多类也就变得臃肿, 维护的成本随之变高. 如果需要增加一种新的算法, 必然需要对算法类进行修改. 这就违反了 OCP 原则和 单一职责 的原则
定义
策略模式定义了一系列的算法, 并将每一个算法封装起来, 而且使它们还可以相互替换. 策略模式让算法独立于使用它的客户而独立变化.
场景
- 针对同一类型问题的多种处理方式, 仅仅是具体行为有差别时
- 需要安全地封装多种同一类型的操作时
- 出现同一抽象类有多个子类, 而又不需要使用 if-else 或者 switch 等来选择具体子类
最方便的记忆法就是记住, 策略模式 可以去掉 if-else 或者 switch . 语句, 即使后续会扩展通过接口来进行扩展, 不会对源代码进行修改. 满足了 OCP开闭原则 .
例子
对于交通费用的计算, 计算的算法可能会有公交, 地铁等
public static void main (String arg[]){
// 创建操作策略的环境类
TranficCalculator calculator = new TranficCalculator();
// 设置公交车的策略, 并准备计算
calculator.setStrategy(new BusStrategy());
System.out.println("公交车-->计算9公里价格: "+calculator.calculatePrice(9));
// 设置地铁的策略, 并准备计算
calculator.setStrategy(new SubwayStrategy());
System.out.println("地铁-->计算9公里价格: "+calculator.calculatePrice(9));
}
你应该可以发现, 这种方式在隐藏实现的同时, 可扩展性 变得很强, 如果此时需要增加一个出租车的计算策略, 那么只需要添加一个实现了 计算策略接口 即可. 对原始代码的修改进行了 关闭 , 并对扩展 开放
源码
动画里面的 插值器Interpolator 利用了策略模式, 利用 Interpolator 策略的抽象, LinearInterpolator , CycleInterpolator 等插值器为具体的实现策略, 通过注入不同的插值器实现不同的动态效果.
动画中的 TimeInterpolator 时间插值器, 它的作用是根据时间流逝的百分比计算出当前属性值改变的百分比, 内置的插值器有如下几种
- 线性插值器(LinearInterpolator) 用于匀速动画
- 加速减速插值器(AccelerateDecelerateInterpolator) :起始时动画加速, 结尾时动画减速
- 减速插值器(DecelerateInterpolator) : 用于随着时间的推移动画越来越慢.