《JavaScript 设计模式与开发实践》- 策略模式

145 阅读1分钟

策略模式

书中策略模式的定义是:定义一系列算法,把他们一个个封装起来,并使他们可以相互替换。

我的理解是,调用方式不变,通过参数可以调用不同的算法。

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 语言的策略模式中,策略类往往被函数所代替,这时策略模式就成为一种隐形的模式。