设计模式应用-策略模式

      平时的工作中小伙伴们比较关心的除了基本工资,岗位工资,各种补助吧啦吧啦,最后当然还有年终奖了,虽然不是人人都有的,举个栗子:绩效为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)
 
   到这,基本没有什么可以优化的了,无论是新增一个级别还是修改一个级别对应的奖金,都足以在最小的改动下满足,而不需要改动主方法
 
 
原文地址:https://www.cnblogs.com/doublewill/p/11966158.html