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)
}

? 同样的,当我们需要增添一种绩效时只需要在对象内部添加属性即可,实现自身的逻辑,不需改动总的计算函数