设计模式《策略模式》

2018-07-10  本文已影响0人  天道__

引言

  继续上一节的模板方法模式,这节我们来说说策略模式。

示例地址

  Demo

先看类图

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新的规则即可。

策略模式与工厂模式的区别

  上面的例子,通过工厂模式也能够实现。那策略模式与工厂模式的区别是什么?

上一篇下一篇

猜你喜欢

热点阅读