美文网首页
设计模式之策略模式

设计模式之策略模式

作者: zhao_ran | 来源:发表于2021-07-15 21:16 被阅读0次

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
但是直接看定义比较难理解,所以可以用一些简单的例子来讲解。

比如说有这样的一个场景:有一天,公司的这季度的业绩不错,老板打算给个员工发放绩效奖金。
如果该员工业绩为优,工资在原有的基本工资上+20%绩效。员工业绩为良,工资在原有的基本工资上+10%绩效。员工业绩为及格,工资在原有的基本工资上+5%绩效。

如果是一名初级开发者,看到这个场景,可能会这样写:

function getSalary(grade,basicSalary){
    if(grade==='优'){
        return basicSalary * 1.2
    }
    if(grade==='良'){
        return basicSalary * 1.1
    } 
    if(grade==='及格'){
        return basicSalary * 1.05
    }
}

功能上看这没什么问题,但是一个函数里面处理了多个逻辑,很明显违背了“单一功能”的原则。
因此我们可以做一下调整。

function gradeYou(basicSalary){
    return basicSalary * 1.2
}
function gradeliang(basicSalary){
    return basicSalary * 1.1
}
function gradeJige(basicSalary){
    return basicSalary * 1.05
}
function getSalary(grade,basicSalary){
    if(grade==='excellent'){
        return gradeYou(basicSalary)
    }
    if(grade==='good'){
        return gradeliang(basicSalary)
    } 
    if(grade==='pass'){
        return gradeJige(basicSalary)
    }
}

很好,现在各个函数都只负责一件事,但是getSalary()里面,还是很多的if,如果老板说,业绩不及格的人没有绩效奖金可以拿,那么就只能再添加一个if

function getSalary(grade,basicSalary){
    if(grade==='excellent'){
        return gradeYou(basicSalary)
    }
    if(grade==='good'){
        return gradeliang(basicSalary)
    } 
    if(grade==='pass'){
        return gradeJige(basicSalary)
    }
     if(grade==='fail'){
        return gradeBujige(basicSalary)
    }
}

这样很明显不符合将不变的部分和变化的部分隔开这种"开放封闭"的原则。为了实现对扩展开放,对修改封闭。我们可以使用对象映射的形式改造。

var salaryRule = {
    excellent(basicSalary) {
        return basicSalary * 1.2
    },
    good(basicSalary) {
        return basicSalary * 1.1
    }, 
    pass(basicSalary) {
        return basicSalary * 1.05
    },
}
function getSalary(grade, basicSalary) {
  return salaryRule[grade](basicSalary)
}

如果以后想要在添加一个不及格,只要给salaryRule新增一个映射关系就好了

salaryRule.fail = function (basicSalary){
return basicSalary
}

相关文章

  • PHP设计模式之策略模式

    PHP设计模式之策略模式

  • PHP设计模式之策略模式

    PHP设计模式之策略模式

  • 简说设计模式之策略模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是策略模式 策略(Strategy)模式...

  • 策略模式

    参考资料:漫话:如何给女朋友解释什么是策略模式? 设计模式之策略模式(实例+Demo) Java设计模式(8)——...

  • 学习Head First设计模式Day1

    Java设计模式之设计模式 策略模式:策略模式定义了算法簇,分别封装起来,让他们之间可以互相替换,此设计模式让算法...

  • 策略模式 2018-11-04

    设计模式之策略模式 官方说明设计模式的3个角色: 环境角色:context , 持有一个策略的引用 抽象策略角色,...

  • Java设计模式——策略模式

    Java设计模式之策略模式 这期分享的模式是策略模式是程序设计中最常用的了,因为开发工作中总是会使用到策略模式。 ...

  • 策略模式

    本文参考自: 《JAVA设计模式》之策略模式(Strategy) 1. 作用 策略模式属于对象的行为模式。其用意是...

  • 设计模式(Swift) - 单例模式、备忘录模式和策略模式

    设计模式(Swift) - 单例模式、备忘录模式和策略模式 设计模式(Swift) - 单例模式、备忘录模式和策略模式

  • 设计模式之策略模式总结

    再上一篇文章《设计模式之策略模式》中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式。本文将通过鸭子...

网友评论

      本文标题:设计模式之策略模式

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