只有一个功能的策略模式

时间:2018-02-02 11:50:21

标签: javascript design-patterns ecmascript-6

strategy pattern是软件的一种设计模式,用于在运行时选择算法。请参阅此javascript implementation以供参考。

请参阅链接页面,示例如何在运行时使用不同的类。但是,如果您只想选择一个功能呢?是否值得在类中封装这些函数?或者只选择要使用的功能,如下一个剪切:

function getRandomThing() {
    return Math.floor(Math.random() * thingsCount);
}

function getNextThing() {
    return currentThing++ % thingsCount;
} 

currentGetThing = getNextThing
currentGetThing()   

此解决方案是否正确?它有效,但currentGetThing = getNextThing对我来说听起来有些像C-like。

2 个答案:

答案 0 :(得分:2)

直接选择功能。

  

是否值得在类中封装这些函数?

没有。如果没有,那么在class中封装任何内容几乎都不值得 - 许多其他语言离不开并且需要class es,因为一切都不会影响您在JavaScript中的选择。< / p>

另外,不要忘记函数已经是JavaScript中的对象,它们是Function类的实例。如果你绝对想为他们定义一个界面,那就去打鸭子他们的call method

答案 1 :(得分:1)

我相信你缺少Context,你的代码中使用算法的部分以及你想要用另一个算法替换算法的地方。看一下策略模式的UML类图,发现Context是模式的重要组成部分。

在模式的静态类型OO实现中,上下文使用策略的抽象,抽象是接口或抽象类。但是,通过一个函数当然也可以工作。它更多是您的实现风格,而不是以任何特定方式实现它的要求。

你的剪辑中缺少的是上下文,这可能引起你对C样风格的怀疑。只需将策略函数传递给上下文,就像将策略对象传递给类似OO语言的上下文一样。

var thingsCount  = 5;
var currentThing = 0;

function getRandomThing() {
    return Math.floor(Math.random() * thingsCount);
}

function getNextThing() {
    return currentThing++ % thingsCount;
} 

// strategy passed as a function
function context(strategy) {

   var result = strategy();
   console.log(result);
   
}

// call the context with different strategies
context(getNextThing);
context(getRandomThing);