一.定义
策略模式定义了一系列算法,并将一系列算法封装起来,使它们能够相互替换。
二.使用角色
1.用来操作策略的上下文环境
2.策略的抽象
2.具体策略实现
三.使用场景:
1.针对同一类问题的多种实现方式.
2.需要安全的封装多重同一类对象时,调用者不会知道算法策略的具体过程。
3.一个类有多个子类,并且在调用的时候用if或switch判断的时候。
四.使用举例说明
这边假如我们需要去一个地方旅游,有几种交通方式选择,然后计算每种交通方式花费的时间,
1.定义公共计算接口(抽象的策略)
public interface RouteCalculate {
int calculate();
}
2.三种交通工具,具体花费时间的算法(策略的具体实现):
/**
* 高铁
*/
public class HighSpeedCalculate implements RouteCalculate{
@Override
public int calculate() {
int busTime = 1;//到高铁站的时间
int highSpeedTime = 5;//高铁的时间
int waitTime = 1;//等车时间
return busTime + highSpeedTime+waitTime;
}
}
/**
* 自己开车
*/
public class CarCalculate implements RouteCalculate{
@Override
public int calculate() {
int carTime = 8;
return carTime;
}
}
/**
* 乘坐飞机
*/
public class airplaneCalcuate implements RouteCalculate{
@Override
public int calculate() {
int busTime = 1;//到机场的时间
int airTime = 2;//飞机的时间
int waitTime = 2;//等飞机时间
return busTime + airTime+waitTime;
}
}
1.定义一个策略的上下文
public class CalculateContext {
private RouteCalculate routeCalculate;
public void setRouteCalculate(RouteCalculate routeCalculate) {
this.routeCalculate = routeCalculate;
}
public int getTime(){
return routeCalculate.calculate();
}
}
以上就是策略模式的简单实现。
五.在Android中的应用:
1.在Android中属性动画的插值器就是使用的策略模式:
Animation animation = new AlphaAnimation(1,0);
animation.setInterpolator(new AccelerateDecelerateInterpolator());
imageView.setAnimation(animation);
animation.start();
1.在Android的LiseView/RecyclerView 中的Adapter,可以设置不同的adapter也是使用的策略模式。
public class ListView extends AbsListView {//相当于环境类
@Override
public void setAdapter(ListAdapter adapter) {//设置策略,即adapter
//其他代码略
}
}
public interface ListAdapter extends Adapter {//抽象策略接口
}
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {//具体策略类BaseAdapter,实现ListAdapter接口
}
public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {//具体策略类ArrayAdapter,继承BaseAdapter,即实现ListAdapter接口
}