关闭设计模式

Art*_*ero 5 language-agnostic groovy closures design-patterns

这些天我正在学习设计模式.有很多关于编程设计模式的文档,但我对闭包设计模式很感兴趣.

我找到了关于Java和Groovy中的设计模式的Venkat Subramaniam的演示,并根据我自己的经验提取了一些涉及闭包和其他模式的演示模式.

执行周围方法

需要在操作前后执行的一对操作.

def operations(closure) {
    println "Open"
    closure()
    println "Close"
}

operations { println "Operation" }

===> Open
===> Operation
===> Close
Run Code Online (Sandbox Code Playgroud)

可插拔行为

在运行时指定对象的行为.

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
Run Code Online (Sandbox Code Playgroud)

迭代器模式

允许顺序访问元素.

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
Run Code Online (Sandbox Code Playgroud)

动态条件执行

创建并执行条件操作.

def greet(user, successClosure, failClosure) {
    if (isAdmin(user)) successClosure()
    else failClosure()
}

greet(user, { println "Hi Admin!" }, { println "Hello User" })
Run Code Online (Sandbox Code Playgroud)

我想知道更多的闭包设计模式.有关于这个主题的参考吗?您可以随意使用自己喜欢的编程语言编写新模式.


更新

我写了一篇关于这个主题的帖子(Groovy和Ruby但内容相同):
闭包设计模式
闭包设计模式.Ruby版

Ton*_*y R 8

我认为你对lambda /匿名函数的封闭感到困惑?

闭包是一个绑定变量的词汇上下文.简而言之,如果从函数内定义函数,则内部函数可以访问外部函数中定义的变量.在这种情况下,"词汇语境"是外部功能.

Lambdas是没有变量赋值的函数.例如,在Ruby中,您可以将块传递给函数,并且函数可以仅使用yield关键字在内部调用它.在JavaScript中,您可以定义一个函数并同时将其作为参数传递.你的例子都是这样的.

第一类函数是另一回事,它们是可以像常规对象一样传递的函数.您可以将它们作为参数传递给函数调用并保持对它们的引用.这就像Ruby一样Proc.在JS中,所有函数都是一流的,所有函数都是对象.

在JavaScript中,我们可以用一个愚蠢的例子来说明所有3:

function foo(func) {
  func();
}
var bar = function() {    // bar is a first-class function
  var i = 5;
  foo(function() {        // this is the anonymous function (lambda)
    console.log(i);       // i is the closure-bound variable
  });
}
foo(bar);   // Prints 5
Run Code Online (Sandbox Code Playgroud)

所以,这会让你的问题变得混乱.闭包是一种语言特征,而不是设计模式.有很多设计模式,其实现可以使用闭包或lambda或modulo或构造函数或其他任何东西,正如您已经展示了这些示例.虽然这些都不是经典的设计模式,所以我不确定我是否会称之为.也许我会称他们为糖.

Java可以实现各种设计模式,但没有这些功能.很多这类东西都是通过接口完成的,这是一种完全不同的语言功能.