再通过一个 Context class 来提供统一的对外接口,Context 内部再调用不同的 策略 方法
一个简单例子
假设要写一个可以同时处理两数加减乘除的函数,我们可能会实现成以下的样子:
doMath 函数接收两个操作数 a 和 b,以及一个算术类型 operation 作为参数,然后根据不同的算术类型返回不同的数学计算结果。
const doMath = (a, b, operation) => {
switch (operation) {
case 'ADD':
return a + b
case 'MINUS':
return a - b
case 'MULTIPLY':
return a * b
case 'DIVIDE':
return a / b
default:
return
}
}
doMath(1, 2, 'ADD') // 3
doMath(1, 2, 'MINUS') // -1
doMath(1, 2, 'MULTIPLY') // 2
doMath(1, 2, 'DIVIDE') // 0.5
可以观察到,多次调用 doMath 函数的共同点在于:
都是输入两个数字
得到这两个数字经过某种计算后的结果作为返回值
而不同点就在于:
具体的计算方式是不一样的
这个问题模式就很适合使用策略模式来解决。
套用策略模式
用 OOP 的形式来实现的话,我们先把上面的例子改写成 class 的形式吧,改写方式之一:
class SimpleMath {
constructor() {
this.operations = {
['ADD']: (a, b) => a + b,
['MINUS']: (a, b) => a - b,
['MULTIPLY']: (a, b) => a * b,
['DIVIDE']: (a, b) => a / b
}
}
calculate(a, b, operation) {
return this.operations[operation](a, b)
}
}