免责声明:我不使用函数式语言;只是试图理解 FP 的某些部分。
Google 建议使用 lambda 的一阶函数可以提供与策略模式提供的类似功能的文章。
然而我们需要以某种方式匹配数据和相应的 lambda。通过 OO 设计,这是自动完成的虚拟方法表 (VMT) http://en.wikipedia.org/wiki/Virtual_method_table,即类型本身携带了推理执行流所需的重要信息,使得进一步添加新行为变得容易(开放封闭原则):继承和覆盖。旧代码保持不变。功能模式匹配在这方面似乎是静态的,并且不允许这种动态。
当然,可以编写一个可配置的匹配行为来根据给定的数据选择 lambda,但这不是我们在 OOP 中开箱即用的吗?
最简单的方法,我认为大多数人在谈论取代策略模式的高阶函数时所指的就是将策略作为参数传递给通用代码。下面是一个 Scala 示例,它对两个数字执行策略,然后将结果乘以 3:
def commonCode(strategy: (Int, Int) => Int)(arg1: Int, arg2: Int) : Int =
strategy(arg1, arg2) * 3
您可以这样定义各种策略:
def addStrategy(arg1: Int, arg2: Int) : Int = arg1 + arg2
def subtractStrategy(arg1: Int, arg2: Int) : Int = arg1 - arg2
添加这样的调用:
commonCode(addStrategy)(2, 3) // returns 15
commonCode(subtractStrategy)(2, 3) // returns -3
您可以使用部分应用程序来避免在各处传递策略:
val currentStrategy = addStrategy _
...
val currentCommon = commonCode(currentStrategy)_
currentCommon(2, 3) // returns 15
这很常见,我们不称其为策略或模式。这只是基本的函数式编程。这strategy
参数到commonCode
函数就像任何其他数据一样。您可以将其与许多其他函数一起放入数据结构中。您可以使用闭包或部分应用程序来关联其他特定于策略的数据。你可以使用像这样的 lambdacommonCode(_ / _)
以避免给你的策略命名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)