JS设计模式-策略模式
JS设计模式-策略模式
以计算薪资为例
1.普通写法
function caculateBonus(performanceLevel, salary){
if(performanceLevel === 'S') return salary * 4
if(performanceLevel === 'A') return salary * 3
if(performanceLevel === 'B') return salary * 2
}
? 可以发现当我们需要添加一个评级需要改动函数内部的代码,这并不符合设计原则的开放封闭原则,当内部代码逻辑复杂时就会很难处理
2.面向对象写法
var performanceS = function(){}
var performanceA = function(){}
var performanceB = function(){}
performanceS.prototype.getSalary = function(salary){
return salary * 4
}
performanceA.prototype.getSalary = function(salary){
return salary * 3
}
performanceB.prototype.getSalary = function(salary){
return salary * 2
}
function caculateBonus(){
this.salary = null
}
caculateBonus.prototype.setSalary = function(salary){
this.salary = salary
}
caculateBonus.prototype.setLevel = function(level){
this.level = level
}
caculateBonus.prototype.caculateResult = function(){
return this.level.getSalary(this.salary)
}
var staff = new caculateBonus()
staff.setSalary(10000)
staff.setLevel(new performanceS())
console.log(staff)
console.log(staff.caculateResult())
核心计算函数
caculateBonus.prototype.caculateResult = function(){
return this.level.getSalary(this.salary)
}
? 当我们需要添加一种绩效时,只需要再写一个类即可无需改动计算薪资的函数
3.非面向对象写法
var caculateSalaryByPerformanceLevel = {
S:function(salary){return salary*4},
A:function(salary){return salary*4},
B:function(salary){return salary*4}
}
function caculate(performanceLevel, salary){
return caculateSalaryByPerformanceLevel[performanceLevel](salary)
}
console.log(caculate('S',10000))
核心计算函数
function caculate(performanceLevel, salary){
return caculateSalaryByPerformanceLevel[performanceLevel](salary)
}
? 同样的,当我们需要增添一种绩效时只需要在对象内部添加属性即可,实现自身的逻辑,不需改动总的计算函数