这种模式是否有封闭的名称?

我经常看到一种模式,在我们查看代码之前需要执行的代码才能访问对象。 当使用这种模式,通常开始用这个词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

上一篇: Is there a name for this pattern with closures?

下一篇: How are Scala closures transformed to Java objects?