5

我经常看到一种模式,这种模式在我们访问对象之前需要执行查找代码的情况下使用。使用这种模式时,通常以with这个词开头。是否有这种封闭模式的名称?

例如,我们必须从数据库中检索需要的客户记录,才可以使用它们:

def withCustomer (id, closure) { 
    def customer = getCustomer(id) 
    closure(customer) 
} 

withCustomer(12345) { customer -> 
    println "Found customer $customer.name" 
} 

的Groovy使得闭合或匿名函数之间没有这样的区别。也许,我可以问一下这个模式是否有匿名函数的名字。

回答

4

这是战略模式。闭包持有一些行为作为参数传递给函数,以便函数可以接受不同的行为。见彼得·诺维格的介绍Design Patterns in Dynamic Languages

的策略是一个变量,其值是一个函数(例如,与 一流的功能,图案不可见)

+0

你怎么看待[@mgryszko答案](http://stackoverflow.com/a/10093625/462015) – 2012-04-18 21:53:08

+0

@Arturo:我曾想过模板方法必然涉及继承,其中战略是一种替代方案,而不是它的一种形式。 http://tech.puredanger.com/2007/07/03/pattern-hate-template/ – 2012-04-19 19:21:54

+0

你对[我自己的回答](http://stackoverflow.com/a/10306434/462015)有什么看法? – 2012-04-24 21:44:08

2

在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 
+0

谢谢,但你不问我的问题。我问了这个模式的名称,而不是使用闭包。 – 2012-04-05 17:34:28

+0

这不是一种模式,而是一种语法形式,Groovy中此语法形式的名称是“**将闭包传递给方法**”。如果你想更接近单词“模式”,Scala中的一个例子是“**函数currying **”(尽管你可以用Scala的函数curry比这个语法形式做更多的事情,但它恰好发生在成为特例之一)。 – tolitius 2012-04-05 17:42:20

1

这取决于上下文。它可以是战略模式(参见Nathan Hughes的答案)。它可以是一个模板方法模式。

Arturo的示例似乎是一个模板方法。您可以定义常见的算法步骤(在这种情况下获取客户)和定制(作为闭包传递)。

+0

你怎么看[我自己的回答](http://stackoverflow.com/a/10306434/462015)? – 2012-04-24 21:45:57

1

最后,我认为这种模式叫做贷款模式

贷款模式,确保资源一旦超出范围就被确定性地处置掉。

您可以在此处看到关于此模式的一些信息:

相关问题