这种模式是否有封闭的名称?
我经常看到一种模式,在我们查看代码之前需要执行的代码才能访问对象。 当使用这种模式,通常开始用这个词with
。
例如,在我们可以使用它们之前,我们有需要从数据库中检索的客户记录:
def withCustomer (id, closure) {
def customer = getCustomer(id)
closure(customer)
}
withCustomer(12345) { customer ->
println "Found customer $customer.name"
}
Groovy在闭包或匿名函数之间没有这样的区分。 也许,我可以问一下这个模式是否有匿名函数的名字。
这是战略模式。 闭包持有一些行为作为参数传递给函数,以便函数可以接受不同的行为。 请参阅Peter Norvig的动态语言设计模式演示文稿:
该策略是一个变量,其值是一个函数(例如,使用一流函数,模式是不可见的)
在Groovy的闭包 - 形式化定义中,它被称为“将闭包交给方法 ”。
Groovy有一个特殊的例子来定义闭包作为方法参数,使闭包语法更易于阅读。 具体而言,如果方法的最后一个参数是Closure类型,则可以使用括号外的显式闭包模块调用该方法。 例如,如果一个类有一个方法:
class SomeCollection {
public void each ( Closure c )
}
然后你可以用括号外的闭包定义来调用each():
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
更传统的语法也是可用的,并且请注意,在Groovy中,在很多情况下可以省略括号,因此这两个变体也是合法的:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ( { println it } ) // Strictly traditional
即使该方法具有其他参数,也适用相同的规则。 唯一的限制是Closure参数必须是最后一个:
class SomeCollection {
public void inject ( x, Closure c )
}
stuff.inject( 0 ) { count, item -> count + item } // Groovy
stuff.inject( 0, { count, item -> count + item } ) // Traditional
这可能与“Groovy问题”不相关,但例如在Scala中,这个“表单”是函数currying的特例:
scala> def fun[A, B](a: A)(b: B) = {true}
fun: [A, B](a: A)(b: B)Boolean
scala> fun(1){2}
res59: Boolean = true
这取决于上下文。 它可以是战略模式(参见Nathan Hughes的答案)。 它可以是一个模板方法模式。
Arturo的例子似乎是一个模板方法。 您可以定义常见的算法步骤(在这种情况下获取客户)和定制(作为闭包传递)。
链接地址: http://www.djcxy.com/p/51497.html