前言
策略模式属于行为类型模式
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
模式结构
策略模式包含如下角色:
- Context: 环境类
- Strategy: 抽象策略类
-
ConcreteStrategy: 具体策略类
示例
公交车和地铁的价格不一样,我们以乘坐不同交通工具为例,计算交通成本。
定义抽象策略类CalculateStrategy
package com.jack.traffic;
public interface CalculateStrategy {
int calculatePrice(int km);
}
策略的具体实现
public class BusStrategy implements CalculateStrategy {
/**
* 10km以内一元钱,超过10km每加1元可以坐5km
*/
public int calculatePrice(int km) {
int extraTotal = km - 10;
int extraFactor = extraTotal / 5;
int fraction = extraTotal % 5;
int price = 1 + extraFactor * 1;
return fraction > 0 ? ++price : price;
}
}
public class SubWayStrategy implements CalculateStrategy {
/**
* <6km,RMB 3 6-12,RMB 4 12-22,RMB 5 22-32,RMB 6 其他 7
*/
public int calculatePrice(int km) {
if (km < 6) {
return 3;
} else if (km <= 12) {
return 4;
} else if (km <= 22) {
return 5;
} else if (km <= 32) {
return 5;
}
return 7;
}
}
环境上下文类
public class TrafficCalculator {
private CalculateStrategy strategy;
public void setStrategy(CalculateStrategy strategy) {
this.strategy = strategy;
}
public int calculatePrice(int km) {
if (strategy == null) {
throw new IllegalArgumentException("The strategy is null.");
}
return strategy.calculatePrice(km);
}
public static void main(String[] args) {
TrafficCalculator trafficCalculator = new TrafficCalculator();
trafficCalculator.setStrategy(new BusStrategy());
int km = 13;
String info = "bus traffic " + km + " km consume RMB:" + trafficCalculator.calculatePrice(km);
System.out.println(info);
}
}
结果
策略模式在Android中的应用
最明显的就是属性动画:
- 时间插值器
网友评论