策略模式
-
概念:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。
-
策略模式的核心思想是将相似的行为封装为一个类,并将该类的调用暴露给外部。由于每个类都包含一个不同的行为,因此我们可以在运行时根据需要选择适当的类实例。
-
作用: 策略模式可以使代码更加灵活、可维护,并且使我们可以在运行时根据需求选择不同的代码实现。在实际开发中,如果遇到类似多重条件判断的问题,我们可以使用策略模式来简化代码并使其更加易于扩展
-
优点:
- 代码可扩展性:使用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)