在策略模式中,实现方式如下:
object StrategyPattern {
def add(a: Int, b: Int) = a + b
def subtract(a: Int, b: Int) = a - b
def multiply(a: Int, b: Int) = a * b
def execute(callback:(Int, Int) => Int, x: Int, y: Int) = callback(x, y)
def main(args: Array[String]) {
println("Add: " + execute(add, 3, 4))
println("Subtract: " + execute(subtract, 3, 4))
println("Multiply: " + execute(multiply, 3, 4))
}
}
我想知道(如果对绑定时间的类型/形式有很好的参考,那么还要了解其他情况),如果方法的绑定时间add, substract, and multiply
是"construction time"
(如果可以这样说的话)还是在runtime
?
简单的答案是(对于具体的类)方法定义在编译时绑定到方法名称,就像在Java中一样。add
例如,您的方法完全等效于以下Java定义:
public int add(int a, int b) {
return a + b;
}
非最终方法
如果您从无法静态了解具体类的调用站点的角度分析非最终方法的绑定时间,则该方法名称将被视为具有对其实现的运行时绑定(由于子类/覆盖)。
动态类加载
简单的答案很接近事实,但是JVM中的动态类加载使事情变得有些复杂。由于动态的类加载,方法定义在技术上my.pkg.StrategyPattern.add
在运行时绑定到完全限定的名称(例如)。当然,可以有一个my.package.StrategyPattern
模块的替代实现,并可以从中动态选择(通过加载相应的类文件)。
当然,这种区别仅与包含该StrategyPattern
定义的编译单元外部的代码有关。在编译单元内,方法总是会在编译时绑定。
战略
既然您在询问策略模式,那么我想您还有其他想法吗?如果您询问是否可以在运行时在“策略”中进行选择,则可以:
val op: (Int, Int) => Int =
if (args(0) == "+") add
else if (args(0) == "-") subtract
else multiply
execute(op, 3, 4)
在这种情况下,op
被绑定到一个“战略”的功能在运行时,但是add
,subtract
和multiply
在编译时仍结合自己的定义。
这是一个实现细节,这些方法中的每一个Function2
在编译时也都与一个匿名类相关联,并且根据条件表达式的结果在运行时实例化了适当的类。这个细节真的是不相关的绑定时间分析,因为的意思add
,subtract
和multiply
标识符是固定在编译时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句