Android开发

策略模式

2017-06-19  本文已影响0人  潇洒人生_cca2

什么是策略模式?

策略模式定义了一系列算法,并将算法封装起来,而且使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式解决的问题

去往某个目的地,我们有多种出行方式,可以选择地铁,公交,步行或者是开车,最终不同的出行方式有不同的价格。如果我们通常的实现方式,提供一个出行的方法,并传入一个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传入即可。

上一篇 下一篇

猜你喜欢

热点阅读