策略模式
书中策略模式的定义是:定义一系列算法,把他们一个个封装起来,并使他们可以相互替换。
我的理解是,调用方式不变,通过参数可以调用不同的算法。
function foo(type) {
if(type === 'one') {
return 1
} else if(type === 'two') {
return 2
} else if(type === 'three') {
return 3
}
}
这段代码很简单也有一些缺点。
- 存在许多 if-else 判断
- 每次 type 类型增加都需要修改 foo 函数
- 对于每个type 对应的代码不容易复用
对于 js 使用策略模式应该怎么优化呢。
const bar = {
one: function() {
return 1
},
two: function() {
return 2
},
three: function() {
return 3
}
}
function foo(type {
bar[type]()
}
这样重构之后解决了以上的三个问题。
在传统面向对象语言中,我们需要定义许多策略类,以接受委托。但是在 js 中,函数也是对象,所以可以直接把策略类定义为函数。
在 js 中,策略函数已经融入语言本身,所谓算法其实就是函数,我们可以把函数四处传递。当我们对这些函数发出调用的消息时,不同的函数返回不同的执行结果。
在 JavaScript 语言的策略模式中,策略类往往被函数所代替,这时策略模式就成为一种隐形的模式。