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)
     
       到这,基本没有什么可以优化的了,无论是新增一个级别还是修改一个级别对应的奖金,都足以在最小的改动下满足,而不需要改动主方法
     
     
  • 相关阅读:
    mysql数据创建带参的存储过程,并在存储过程中调用另一个存储过程
    python解析.xls/.xlsx文件--openpyxl模块(第三方)
    python使用django开发接口
    Mysql创建存储过程--批量插入数据
    Centos7下安装kafka,并使用python操作kafka的简单使用
    Centos7下安装JDK1.8
    Centos7下docker的安装
    python解析.xml文件-- xmltodict模块(第三方)
    解决:git SSL certificate problem: unable to get local issuer certificate
    AD域是什么意思?
  • 原文地址:https://www.cnblogs.com/doublewill/p/11966158.html
Copyright © 2011-2022 走看看