引言
继续上一节的模板方法模式,这节我们来说说策略模式。
示例地址
先看类图
image看看策略模式的定义
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
使用场景
1. 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
2. 需要安全地封装多种同一类型的操作时。
3. 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。
策略模式示例
上班几年了,估计大家手里都有点零花钱,银行的那点利息,我们只能无力吐槽了,现在是互联网时代,我们可以选择的很多,比如 余额宝、网商银行、陆金所等等。下面我们以陆金所为例。对于你存多少钱、多长时间,利息都是不同的。我们用策略模式来实现。
1. 计算收益的接口
/**
* @author 512573717@qq.com
* @created 2018/7/11 下午3:17.
*/
public interface IFinanceStrategy {
//计算收益
double earnings(int total);
}
2. 3月的利息
/**
* 90天的收益
*
* @author 512573717@qq.com
* @created 2018/7/12 上午9:46.
*/
public class ThreeStrategy implements IFinanceStrategy {
@Override
public double earnings(int total) {
// 90天后可提现 年利率4.7%
BigDecimal b1 = new BigDecimal(0.047 * 90);
BigDecimal b2 = new BigDecimal(365);
double result = b1.divide(b2, 6, BigDecimal.ROUND_HALF_UP).doubleValue() * total;
return result;
}
}
3. 半年的利息
/**
* 197天收益
*
* @author 512573717@qq.com
* @created 2018/7/12 下午1:53.
*/
public class HalfYearStrategy implements IFinanceStrategy {
@Override
public double earnings(int total) {
// 197天后可提现 年利率5.2%
BigDecimal b1 = new BigDecimal(0.052 * 197);
BigDecimal b2 = new BigDecimal(365);
double result = b1.divide(b2, 6, BigDecimal.ROUND_HALF_UP).doubleValue() * total;
return result;
}
}
4. 一年的利息
/**
* 一年的收益
*
* @author 512573717@qq.com
* @created 2018/7/12 下午1:56.
*/
public class OneYearStrategy implements IFinanceStrategy {
@Override
public double earnings(int total) {
// 1年后可提现 年利率10.2%
return 0.102 * total;
}
}
5. 总收益计算器
/**
* 总收益计算器
*
* @author 512573717@qq.com
* @created 2018/7/12 下午2:01.
*/
public class TotalMoney {
private IFinanceStrategy mFinanceStrategy;
public void setFinanceStrategy(IFinanceStrategy financeStrategy) {
mFinanceStrategy = financeStrategy;
}
public double totalMoney(int total) {
return mFinanceStrategy.earnings(total);
}
}
6. Client
TotalMoney money=new TotalMoney();
System.out.println("三个月的收益");
money.setFinanceStrategy(new ThreeStrategy());
System.out.println(money.totalMoney(50000));
System.out.println("半年的收益");
money.setFinanceStrategy(new HalfYearStrategy());
System.out.println(money.totalMoney(50000));
System.out.println("一年的收益");
money.setFinanceStrategy(new OneYearStrategy());
System.out.println(money.totalMoney(50000));
总结
增强程序的扩展性,如果我们想新增一个三年的利益,只需要实现计算利益接口, 在Client set新的规则即可。
策略模式与工厂模式的区别
上面的例子,通过工厂模式也能够实现。那策略模式与工厂模式的区别是什么?
- 用途不一样
1. 工厂是创建型模式,它的作用就是创建对象;
2. 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为。 - 关注点不一样
1. 一个关注对象创建
2. 一个关注行为的封装
网友评论