• 设计模式应用-策略模式


          平时的工作中小伙伴们比较关心的除了基本工资,岗位工资,各种补助吧啦吧啦,最后当然还有年终奖了,虽然不是人人都有的,举个栗子:绩效为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)
     
       到这,基本没有什么可以优化的了,无论是新增一个级别还是修改一个级别对应的奖金,都足以在最小的改动下满足,而不需要改动主方法
     
     
  • 相关阅读:
    js鼠标事件/onclick/鼠标点击/光标移开
    搭建PHP环境
    SQL语法的一些整理
    DataTime格式大全啊!
    分页存储过程
    jquery中获取键盘按键
    中国历史朝代歌(完整)
    js键盘事件
    js鼠标、键盘事件实例代码
    《.NET Compact Framework移动开发指南》答疑一
  • 原文地址:https://www.cnblogs.com/doublewill/p/11966158.html
Copyright © 2020-2023  润新知