【发布时间】:2012-04-17 16:29:22
【问题描述】:
这些天我正在学习设计模式。有很多关于编程设计模式的文档,但我对闭包设计模式很感兴趣。
我找到了 Venkat Subramaniam 关于Design Patterns in Java and Groovy 的演示文稿,并根据我自己的经验提取了该演示文稿中涉及闭包的一些模式和其他模式。
执行环绕方法
操作前后需要执行的一对操作。
def operations(closure) {
println "Open"
closure()
println "Close"
}
operations { println "Operation" }
===> Open
===> Operation
===> Close
可插拔行为
指定对象在运行时的行为。
def selectValues(number, closure) {
def list = []
1.upto(number) {
if (closure(it)) list << it
}
return list
}
assert [2, 4, 6, 8, 10] == selectValues(10) { it % 2 == 0 } // even
assert [1, 3, 5, 7, 9] == selectValues(10) { it % 2 != 0 } // odd
迭代器模式
允许顺序访问元素。
def listNumbers(closure) {
(0..5).each { closure it }
}
listNumbers {
if (it < 3) println "$it is a little number"
else println "$it is a big number"
}
===> 0 is a little number
===> 1 is a little number
===> 2 is a little number
===> 3 is a big number
===> 4 is a big number
===> 5 is a big number
动态条件执行
创建并执行条件操作。
def greet(user, successClosure, failClosure) {
if (isAdmin(user)) successClosure()
else failClosure()
}
greet(user, { println "Hi Admin!" }, { println "Hello User" })
我想了解更多闭包设计模式。有没有关于这个话题的参考?随意用你最喜欢的编程语言编写一个新模式。
更新
我写了一篇关于这个主题的帖子(Groovy 和 Ruby,但内容相同):
Closure Design Patterns
Closure Design Patterns. Ruby Edition
【问题讨论】:
-
如果必须命名某些东西,我通常会发现其中有太多的想法。 A closure just represents an invocable context(例如函数)带有一组 [非空] 绑定变量。没什么特别的。另请注意,闭包是一种特殊类型的 lambda 或匿名函数(绑定一个或多个变量的函数):
selectValues中可能没有闭包(嗯, 任何上面的例子),例如。无论如何......我并没有真正“得到”这个问题。 -
(实际上,闭包也不必是匿名的:它们正好适合这样的模式。)
-
好问题阿图罗:)。我想有些答案不会像您希望的那样与语言无关,因为在诸如 Groovy、JavaScript 或 Ruby 之类的语言中可以做的事情在 Java 中没有太大意义。 “但是 Java 没有闭包!”你可能会说……嗯,它有词法范围(匿名)类,你可以用它做所有可以用闭包做的事情。但这样做太麻烦了,只需重复“过滤器”或“映射”的逻辑,一次又一次地编写相同的“for each”循环会更容易。
-
@pst 你对什么是闭包是正确的。 Arturo 的问题可能是 Groovy 语言使用术语“闭包”来指代任何匿名函数。它们是
Closure类的一个实例。我认为类似于 Ruby 的Procs。顺便说一句,我也同意将函数的一些常见用途命名为一等对象并没有多大价值。我会坚持说,期望另一个函数作为参数或返回函数的函数是“高阶函数”,仅此而已。但我也认为尝试找到这些模式很酷:) -
@Arturo 在你做任何事情之前,我会阅读一些关于设计模式这个术语的历史。这是一个有趣的问题,许多老前辈(相对于大多数这些概念的发明,并没有那么老)只会想起 Gang of Four 模式,而其他人可能会想到 JavaEE 模式。我认为您的示例有更新的术语,例如 sugar 或 expressive power (在维基百科上查找,它简要讨论了高阶函数和闭包) .也许你应该问一个关于 Groovy 的问题 =D
标签: design-patterns language-agnostic groovy closures