美文网首页
2019-04-17设计模式-策略模式

2019-04-17设计模式-策略模式

作者: 猫KK | 来源:发表于2019-04-17 15:41 被阅读0次

    定义一些列算法,将它们封装起来并且使它们可以相互调用。主要用来解决多个if-else问题

    来一个简单的例子:金融理财,每一个理财产品就相当于一个策略。计算每个产品的效益,按正常思路来:

    //新建一个金融类
    class Finance {
        //计算效益
        public float moneyRate(int month, int money, int type) {
            //假定 type = 1 为其中的一个理财产品
            if (type == 1) {
                //分别计算使用不同月份的效益
                if (month == 3) {
                    return (float) (money + month * money * 0.09 / 12);
                }
                if (month == 6) {
                    return (float) (money + month * money * 0.10 / 12);
                }
                if (month == 9) {
                    return (float) (money + month * money * 0.11 / 12);
                }
                throw new IllegalStateException("没有对应的期限");
            }
            //假定 type = 2 为另一个理财产品
            if (type == 2) {
                 //分别计算使用不同月份的效益
                if (month == 3) {
                    return (float) (money + month * money * 0.10 / 12);
                }
                if (month == 6) {
                    return (float) (money + month * money * 0.11 / 12);
                }
                if (month == 9) {
                    return (float) (money + month * money * 0.12 / 12);
                }
                throw new IllegalStateException("没有对应的期限");
            }
            throw new IllegalStateException("没有对应的产品");
        }
    }
    

    使用方法如下

    public class FinanceClient {
        public static void main(String[] args) {
            Finance finance = new Finance();
            float money = finance.moneyRate(3, 10000, 1);
            System.out.println("------->" + money);
        }
    }
    

    上面的写法,假如不在需要拓展,看起来还行,当假如增加一种 type = 3 的产品,就需要在Finance类中增加一个if条件语句。如果产品越来越多,if语句就会越来越多,Finance会显得特别的臃肿,下面使用策略模式来改写

    public interface IFinance {
        float moneyRate(int month, int money);
    }
    

    抽象出一个计算的接口,让子类去实现自己对应的计算方法,即对应的策略

     //type1 产品的策略方法实现
    public class Type1 implements IFinance {
        @Override
        public float moneyRate(int month, int money) {
            if (month == 3) {
                return (float) (money + month * money * 0.10 / 12);
            }
            if (month == 6) {
                return (float) (money + month * money * 0.11 / 12);
            }
            if (month == 12) {
                return (float) (money + month * money * 0.12 / 12);
            }
            throw new IllegalStateException("没有对应的期限");
        }
    }
    

    一般来说,还需要一个类似Context的类,用来管理

    public class Context {
        private IFinance finance;
    
        public Context(IFinance finance) {
            this.finance = finance;
        }
    
        public float moneyRate(int month, int money) {
            return finance.moneyRate(month, money);
        }
    }
    

    最后使用

    public class FinanceClient {
        public static void main(String[] args) {
            Context context = new Context(new Type1());
            float money = context.moneyRate(3, 10000);
            System.out.println("---->" + money);
        }
    }
    

    相关文章

      网友评论

          本文标题:2019-04-17设计模式-策略模式

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