策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
但是直接看定义比较难理解,所以可以用一些简单的例子来讲解。
比如说有这样的一个场景:有一天,公司的这季度的业绩不错,老板打算给个员工发放绩效奖金。
如果该员工业绩为优,工资在原有的基本工资上+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
}
网友评论