什么是策略模式?
策略模式定义了一系列算法,并将算法封装起来,而且使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式解决的问题
去往某个目的地,我们有多种出行方式,可以选择地铁,公交,步行或者是开车,最终不同的出行方式有不同的价格。如果我们通常的实现方式,提供一个出行的方法,并传入一个Mode,通过Mode判断最终选择的方式,计算价格,实际的方法中是一个个if...else的判断,这样理论上能够实现最终的结果。
如果以后添加了一种新的出行方式,那么我们要做两步:
(1)添加Mode
(2)添加一个新的if...else
这样势必导致了很复杂的代码量,我们可以换一种思路
(1)定义一个接口Strategy,该接口定义一个计算价格的方法。
(2)对于不同的出行方式分别实现该接口,在出行的方法中实现自己的规则。
(3)在具体选择出行时,根据方式选择不同的出行方式,传入不同的实现对象,计算价格。
策略模式的简单实现
根据如上方式,编写一个Demo.
首先我们定义一个接口CalculateStrategy,该接口定义了一个计算价格的方法。
public interface CalculateStrategy{
// 计算价格public int calculatePrice();
}
其次,我们有两种出行方式,公交车和地铁,对于这两种方式,有不同的计算价格,所以我们编写两个实现类实现接口。
公交车的价格计算方式:
public class BusStrategy implements CalculateStrategy{
@Override
public int calculatePrice() {
// 公交车的出行的价格
return10;
}
}
地铁的计算方式
public class SubwayStrategy implements CalculateStrategy{
@Override
public intcalculatePrice() {// 地铁的出行return5;
}
}
如上,准备完成,我们该出发了,定义出行的类TranficCalculator
public classTranficCalculator {
// 多态,父类引用
CalculateStrategymStrategy;
// 设置出行方式
public voidsetmStrategy(CalculateStrategy mStrategy) {
this.mStrategy= mStrategy;
}
// 计算价格
public intcalculatePrice(){
returnmStrategy.calculatePrice();
}
public static voidmain(String[] args){
TranficCalculator calculate =newTranficCalculator();
calculate.setmStrategy(newBusStrategy());// 设置出行方式
intprice = calculate.calculatePrice();//计算价格
}
}
在main函数中,我们首先构造出行的对象calculate,设置其出行方式,调用计算价格的方法就得出了最终的价格。
如果是地铁,我们只需要new SubwayStrategy()对象传入即可,如果以后增加了出行方式,只需要继承Strategy即可。省略了复杂的if else流程。
实际使用举例
动画插值器
如果使用过动画的同学应该都设置过插值器,当我们想要对动画的过程变化进行控制时,可以通过anim.setInterpolator(new AccelerateInterpolator());设置插值器,Android提供了匀速,加速减速,减速等插值器。
看原理就能明白,当我们需要改变动画变化过程时,只需要传入插值器的实现类的实例化方法,交由他来计算这个变化。具体的动画不需要了解不同插值器的计算方式。
在实际的开发中,往往使用一些第三发的网络请求库,例如volley,okhttp,retrofit等等,如果我们使用了其一,当因为需要去换另一个框架的时候,会非常的麻烦,此时我们可以使用策略模式来解决我们的问题。
对于网络请求的使用,无非就是几个常用的方式:
(1)设置header
(2)设置请求参数
(3)设置请求方式
(4)结果回调
我们可以将上述的操作抽象出一个接口,利用使用的网络框架编写一个XXXAdapter来实现接口中的方法,那么在使用过程中通过保持接口的引用进行网络请求即可,如果下一次需要更换网络框架,只需要重新编写一个XXXAdaopter传入即可。
网友评论