js-day22-设计模式-策略模式

74 阅读2分钟

策略模式

  • 概念:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。

  • 策略模式的核心思想是将相似的行为封装为一个类,并将该类的调用暴露给外部。由于每个类都包含一个不同的行为,因此我们可以在运行时根据需要选择适当的类实例。

  • 作用: 策略模式可以使代码更加灵活、可维护,并且使我们可以在运行时根据需求选择不同的代码实现。在实际开发中,如果遇到类似多重条件判断的问题,我们可以使用策略模式来简化代码并使其更加易于扩展

  • 优点:

    • 代码可扩展性:使用if判断时,每次添加新的判断条件都需要修改已有的代码。而策略模式都是一个一个的方法
    • 可维护性:使用if判断导致代码中存在大量的条件分支,使得代码逻辑复杂且难以维护。而使用策略模式可以将不同条件的逻辑分散到各个策略类中,使得代码结构清晰,易于理解和维护。
    • 代码复用性好

举例讲解

例如:假如需要实现一个计算员工奖金的程序,效绩为 S 则发基本工资的4倍,A 则3倍,以此类推,那么我们正常实现该代码,是通过判断分支语句来实现


 function totalMoney(level, price){
     // 之前的方式,肯定需要一个一个去判断
     if(level === 'S'){
         return price * 4
     }
     if(level === 'A'){
         return price * 3
     }
     if(level === 'B'){
         return price * 2
     }
 }
 const price1 = totalMoney('S', 20000)
 console.log(price1)

 const price2 = totalMoney('B', 20000)
 console.log(price2)

采用策略模式: 函数封装方法

function totalMoney(level, price){
    let bonus = {
        'S': (price)=>{return price * 4},
        'A': (price)=>{return price * 3},
        'B': (price)=>{return price * 2}
    }
    return bonus[level](price)
}
const price1 = totalMoney('S', 20000)
console.log(price1)
const price2 = totalMoney('B', 20000)
console.log(price2)

使用一个对象记录相关计算的方法

// 使用一个对象记录相关计算的方法
let bonus = {
    'S': (price)=>{return price * 4},
    'A': (price)=>{return price * 3},
    'B': (price)=>{return price * 2}
}
        
// 使用一个函数去做相关的计算
function calc(level, price){
    return bonus[level](price)
}
// 可以设置一个方法专门添加绩效等级方法
// 静态方法
calc.add = function(level, fn){
    bonus[level] = fn
}
calc.add('C', (price)=>{
    return price * 1.5
})
// const price1 = calc('S', 20000)
// console.log(price1)
// const price2 = calc('B', 20000)
// console.log(price2)
const price3 = calc('C', 20000)
console.log(price3)