zoukankan      html  css  js  c++  java
  • 设计模式应用-策略模式

          平时的工作中小伙伴们比较关心的除了基本工资,岗位工资,各种补助吧啦吧啦,最后当然还有年终奖了,虽然不是人人都有的,举个栗子:绩效为A的小伙伴,年终奖为6个月工资;绩效为B的小伙伴,年终奖为3个月工资;绩效为C的小伙伴,年终奖为2个月工资,一个简单的薪资计算公式就来了
            function calculateBonus (performanceLevel, salary) {
                if(performanceLevel==='A'){
                    return salary * 6
                }
                if(performanceLevel==='B'){
                    return salary * 3
                }
                if(performanceLevel==='C'){
                    return salary * 2
                }
            }
     
           calculateBonus ('A',  2000) =>    12000 轻松实现
         分割线================================================================
         显然这样的方式可以实现想要的结果,但是从单一职责原则来看,对于不同的级别,有一天我们需要修改相应的奖金倍数,势必要改函数体的逻辑
         考虑把计算逻辑抽离
            let performanceA = function(salary){
                return salary * 6
            };
            let performanceB = function(salary){
                return salary * 3
            };
            let performanceC = function(salary){
                return salary * 2
            };
            let calculateBonus = function (performanceLevel, salary) {
                if(performanceLevel==='A'){
                    return performanceA(salary)
                }
                if(performanceLevel==='B'){
                    return performanceB(salary)
                }
                if(performanceLevel==='C'){
                    return performanceC (salary)
                }
            }
       
            这样的话,对于不同级别的奖金,只需要修改相应的计算逻辑而不需要再动外部的计算逻辑,这样比上一步好一些,但是依然有优化的空间,每个人都有奖金,体现不了区别,公司说了我们要增加一个级别D,没有奖金,这个时候又要改逻辑包括计算逻辑。
        分割线=================================================================
        let strategy = {
            "A":function(salary){
                return salary * 6
            },
            "B":function(salary){
                return salary * 3
            },
            "C":function(salary){
                return salary * 2
            },
            "D":function(salary){
                return 0
            },
        };
     
        function calculateBonus (level,salary) {
            return strategy[level](salary)
        }
     
        calculateBonus("A", 2000)
     
       到这,基本没有什么可以优化的了,无论是新增一个级别还是修改一个级别对应的奖金,都足以在最小的改动下满足,而不需要改动主方法
     
     
  • 相关阅读:
    AtCoder Grand Contest 015 题解
    AtCoder Grand Contest 014 题解
    AtCoder Grand Contest 013 题解
    AtCoder Grand Contest 012 题解
    AtCoder Grand Contest 011 题解
    AtCoder Grand Contest 010 题解
    AtCoder Grand Contest 009 题解
    NOIP2017 Day2 题解
    博客园主题备份
    多项式全家桶
  • 原文地址:https://www.cnblogs.com/doublewill/p/11966158.html
Copyright © 2011-2022 走看看