js设计模式--策略模式
设计模式的宗旨: 把不变的和变化的分开。
策略模式:定义一系列的算法,然后把它们一个个封装起来,并且使它们可以相互替换。
分析:根据设计模式的宗旨,这里是分成两个部分,一个部分是定义好的算法,这个是属于变化的部分,一部分属于调用算法部分,这部分属于不变部分
以计算员工工资为例子:
- 员工的工资分成基本工资+绩效工资
- 绩效工资 = 基本工资 * 等级参数
- 等级有A,B,C对应的等级参数是 0.4, 0.3, 0.2
我们先来定义好算法部分:
const strategy = {
'A': function(salary){
return salary*(1 + 0.5)
},
'B': function(salary){
return salary*(1 + 0.4)
},
'C': function(salary){
return salary*(1 + 0.3)
}
}
分析:strategy里面的三个方法都是可以相互替换的,方法参数都是基本工资,输入时总共工资
现在来下写不变的一部分,看看是怎么调用算法的
function getTotalSalary(level, salary) {
return strategy[level](salary)
}
分析: 这个函数,接受了等级(level)和基本工资(salary)两个参数,然后去调用strategy对应的函数的方法,这就是把计算总共工资委托给了stragegy的方法,所以getTotalSalary是不做计算工资的工作的,这样也就是实现了多态
最后我们来调用一下
getTotalSalary('A', 1828); //2742
getTotalSalary('B', 2828); //3959.2
getTotalSalary('C', 4828); //6276.4
分析:这样如果再想添加一个等级D,我们主要在策略里面进行添加就行了,避免代码重复的复制粘贴。这样结构清楚,且解决我们多重的if...else..if。