是否有这种封闭模式的名称?
我经常看到一种模式,这种模式在我们访问对象之前需要执行查找代码的情况下使用。使用这种模式时,通常以with
这个词开头。是否有这种封闭模式的名称?
例如,我们必须从数据库中检索需要的客户记录,才可以使用它们:
def withCustomer (id, closure) {
def customer = getCustomer(id)
closure(customer)
}
withCustomer(12345) { customer ->
println "Found customer $customer.name"
}
的Groovy使得闭合或匿名函数之间没有这样的区别。也许,我可以问一下这个模式是否有匿名函数的名字。
这是战略模式。闭包持有一些行为作为参数传递给函数,以便函数可以接受不同的行为。见彼得·诺维格的介绍Design Patterns in Dynamic Languages:
的策略是一个变量,其值是一个函数(例如,与 一流的功能,图案不可见)
在Groovy的Closures - Formal Definition它只是被称为“传递闭包方法”。
Groovy有一个特殊的例子来定义闭包作为方法参数,使闭包语法更易于阅读。具体而言,如果方法的最后一个参数是Closure类型,则可以使用括号外的显式闭包模块调用该方法。例如,如果类具有的方法:
class SomeCollection {
public void each (Closure c)
}
然后,你可以调用与闭合定义中的每个()括号以外:
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
的更传统的语法也是可用的,并且还请注意,在Groovy中,你可以在许多情况下括号的Elid,所以这两个变化也是合法的:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ({ println it }) // Strictly traditional
该规则同样适用,即使该方法具有其他参数。唯一的限制是,封闭参数必须是最后一个:
class SomeCollection {
public void inject (x, Closure c)
}
stuff.inject(0) { count, item -> count + item } // Groovy
stuff.inject(0, { count, item -> count + item }) // Traditional
这可能不相关的“常规问题”,但例如在Scala中,这种“形式”是一个特例功能柯里尔:
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
谢谢,但你不问我的问题。我问了这个模式的名称,而不是使用闭包。 – 2012-04-05 17:34:28
这不是一种模式,而是一种语法形式,Groovy中此语法形式的名称是“**将闭包传递给方法**”。如果你想更接近单词“模式”,Scala中的一个例子是“**函数currying **”(尽管你可以用Scala的函数curry比这个语法形式做更多的事情,但它恰好发生在成为特例之一)。 – tolitius 2012-04-05 17:42:20
这取决于上下文。它可以是战略模式(参见Nathan Hughes的答案)。它可以是一个模板方法模式。
Arturo的示例似乎是一个模板方法。您可以定义常见的算法步骤(在这种情况下获取客户)和定制(作为闭包传递)。
你怎么看[我自己的回答](http://stackoverflow.com/a/10306434/462015)? – 2012-04-24 21:45:57
最后,我认为这种模式叫做贷款模式。
贷款模式,确保资源一旦超出范围就被确定性地处置掉。
您可以在此处看到关于此模式的一些信息:
- 'Loan' pattern - 斯卡拉
- Loan my Resource Pattern - Groovy中的答案
你怎么看待[@mgryszko答案](http://stackoverflow.com/a/10093625/462015) – 2012-04-18 21:53:08
@Arturo:我曾想过模板方法必然涉及继承,其中战略是一种替代方案,而不是它的一种形式。 http://tech.puredanger.com/2007/07/03/pattern-hate-template/ – 2012-04-19 19:21:54
你对[我自己的回答](http://stackoverflow.com/a/10306434/462015)有什么看法? – 2012-04-24 21:44:08