美文网首页
设计模式《策略模式》

设计模式《策略模式》

作者: 天道__ | 来源:发表于2018-07-10 14:17 被阅读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新的规则即可。

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

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

    • 用途不一样
        1. 工厂是创建型模式,它的作用就是创建对象;
        2. 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为。
    • 关注点不一样
        1. 一个关注对象创建
        2. 一个关注行为的封装

    相关文章

      网友评论

          本文标题:设计模式《策略模式》

          本文链接:https://www.haomeiwen.com/subject/skifpftx.html