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);
语境(事物)如果您有一个将要使用的单一策略,我就不会为抽象而烦恼。抽象增加了复杂性,这在你需要的时候是很好的,但在你不需要的时候只是为了复杂性。只有当你认为你正在处理的代码将来会被扩展/扩展时,才值得封装。不要这样做。如果你现在不需要它,你就不需要它。如果您想在以后抽象它,因为它变得更复杂,那么以后再抽象它。简单的解决方案永远是最好的,等等。就我个人而言,我更喜欢知道我的选择,让事情简单化。你也是这样。您现在应该保持简单,并记住如果需要,您将如何重构以扩展/扩展代码。您已经知道可以使用策略模式。(思考如何扩展/扩展我的代码帮助我快速学习不同的设计模式)。这里根本没有封装,但Strategy模式在上下文类中封装了策略。上下文是使用currentGetting()
但在决定添加另一个实现时不需要更改的代码。对策略进行抽象可以说明策略的作用(它不仅仅是一个函数),将其封装在上下文中可以防止任何人将currentGetThing
设置为任何函数。这是一个类似C的东西。但是,您可以在Javascript中进行封装和抽象,而不需要类。如果您有一个单独的策略,我就不必为抽象费心了。抽象增加了复杂性,这在你需要的时候是很好的,但在你不需要的时候只是为了复杂性。只有当你认为你正在处理的代码将来会被扩展/扩展时,才值得封装。不要这样做。如果你不需要它不