Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅针对一个功能的策略模式_Javascript_Design Patterns_Ecmascript 6 - Fatal编程技术网

Javascript 仅针对一个功能的策略模式

Javascript 仅针对一个功能的策略模式,javascript,design-patterns,ecmascript-6,Javascript,Design Patterns,Ecmascript 6,软件是一种在运行时选择算法的设计模式。见此参考 请参见链接页面,该示例如何在运行时使用不同的类。但是,如果你只想选择一个函数呢?是否值得将这些函数封装在类中?或者只需选择要使用的函数,如下一个截图中所示: function getRandomThing() { return Math.floor(Math.random() * thingsCount); } function getNextThing() { return currentThing++ % thingsCoun

软件是一种在运行时选择算法的设计模式。见此参考

请参见链接页面,该示例如何在运行时使用不同的类。但是,如果你只想选择一个函数呢?是否值得将这些函数封装在类中?或者只需选择要使用的函数,如下一个截图中所示:

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

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

currentGetThing = getNextThing
currentGetThing()   

这个解决方案正确吗?它可以工作,但对我来说,currentGetThing=getNextThing听起来有点像C语言。

直接选择函数即可

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

不。如果你可以不使用
,那么将任何东西封装在
类中几乎是不值得的——许多其他语言都离不开
类,并且需要
es,因为任何东西都不会影响你在JavaScript中的选择


另外,不要忘记函数已经是JavaScript中的对象,它们是
函数
类的实例。如果您确实想为它们定义一个接口,只需直接选择函数即可

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

不。如果你可以不使用
,那么将任何东西封装在
类中几乎是不值得的——许多其他语言都离不开
类,并且需要
es,因为任何东西都不会影响你在JavaScript中的选择


另外,不要忘记函数已经是JavaScript中的对象,它们是
函数
类的实例。如果您确实想为它们定义一个接口,只需使用duck键入它们的接口。

我相信您缺少上下文,即代码中使用该算法的部分,以及希望用另一个算法替换该算法的部分。查看策略模式的UML类图,发现上下文是模式的重要部分

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

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

var thingscont=5;
var-currentThing=0;
函数getRandomThing(){
返回Math.floor(Math.random()*thingscont);
}
函数getNextThing(){
返回currentThing++%thingsCount;
} 
//作为函数传递的策略
功能上下文(策略){
var结果=策略();
控制台日志(结果);
}
//使用不同的策略调用上下文
上下文(getNextThing);

语境(事物)我认为您缺少上下文,您的代码中使用该算法的部分,以及您希望用另一个算法替换该算法的部分。查看策略模式的UML类图,发现上下文是模式的重要部分

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

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

var thingscont=5;
var-currentThing=0;
函数getRandomThing(){
返回Math.floor(Math.random()*thingscont);
}
函数getNextThing(){
返回currentThing++%thingsCount;
} 
//作为函数传递的策略
功能上下文(策略){
var结果=策略();
控制台日志(结果);
}
//使用不同的策略调用上下文
上下文(getNextThing);

语境(事物)currentGetting()
但在决定添加另一个实现时不需要更改的代码。对策略进行抽象可以说明策略的作用(它不仅仅是一个函数),将其封装在上下文中可以防止任何人将
currentGetThing
设置为任何函数。这是一个类似C的东西。但是,您可以在Javascript中进行封装和抽象,而不需要类。如果您有一个单独的策略,我就不必为抽象费心了。抽象增加了复杂性,这在你需要的时候是很好的,但在你不需要的时候只是为了复杂性。只有当你认为你正在处理的代码将来会被扩展/扩展时,才值得封装。不要这样做。如果你不需要它不