策略模式Strategy

模式介绍

开发中可能有这样的情况: 实现某一个功能可以有多中算法或者策略, 我们根据不同的功能来选择不同的算法. 针对这种情况,
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) : 用于随着时间的推移动画越来越慢.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值