动机
- 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,会使对象变得异常复杂.
- 在运行时根据需要透明地改变对象的算法,将算法与对象本身解耦
定义
定义一系列算法,把他们一个个封装起来,使它们可以相互替换,该模式使得算法可独立于使用它的客户程序而变化
image.png
要点
- Strategy 及其子类为组件提供一系列可重用的算法,从而可以使得类型在
运行时
方便地根据需要在各个算法之间切换 - Strategy模式提供了用
条件判断
语句外的选择,消除条件判断
语句,就是在解耦合.含有许多条件判断语句的代码通常都可以使用Strategy模式 - 如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而降低对象实例化数量
不适用的场景
- if-else判断都是确认不会改变的.例如一周7天
示例
各国的税收算法不一样,通过Strategy模式
替换掉if-else
/**
* 抽象的税收方法
*
* @author roger
* @date 2019/8/21
*/
public abstract class TaxStrategy {
/**
* 计算税
*
* @param incoming 收入
* @return
*/
protected abstract double calculateTax(double incoming);
}
/**
* China税收计算方式
* @author roger
* @date 2019/8/21
*/
public class ChinaTaxStrategy extends TaxStrategy {
@Override
protected double calculateTax(double incoming) {
return Math.max((incoming - 10000) * 0.05,0);
}
}
/**
* 日本税收
* @author roger
* @date 2019/8/21
*/
public class JapanTaxStrategy extends TaxStrategy {
/**
* 计算税
*
* @param incoming 收入
* @return
*/
@Override
protected double calculateTax(double incoming) {
return Math.max((incoming * 0.03) - 500, 0);
}
}
/**
* 美国税收
* @author roger
* @date 2019/8/21
*/
public class USTaxStrategy extends TaxStrategy {
/**
* 计算税
*
* @param incoming 收入
* @return
*/
@Override
protected double calculateTax(double incoming) {
return incoming * 0.05;
}
}
public static void main(String[] args) {
TaxStrategy strategy = new ChinaTaxStrategy();
double tax = strategy.calculateTax(20000);
}