Groovy探索之闭包 五
《Groovy探索之闭包》进入到第五篇,重点来讲讲闭包和模式的关系。我们知道,在Java界,设计模式是名声在外了。由于模式有很好的扩展性,我们通常很喜欢使用它们。但在Java语言中使用模式,我们最大的抱怨就是代码臃肿;由于过于对依赖进行过多的拆分,造成类个数成倍增加。一句话,扩展性虽然好,但编码的效率却低。
比如说,我们在Java中常用到的Collections.sort(Collection collection,Comparator comparator)方法,就使用到了策略模式,所谓“策略模式”,就是对算法的封装。而Collections.sort(Collection collection,Comparator comparator)方法中,对比较算法进行了封装。
具体说来,Collections.sort(Collection collection,Comparator comparator)方法有了明确的排序算法,但它却不能确定具体的比较算法,因为不知道“Collections.sort(Collection collection,Comparator comparator)”方法的使用者会使用JavaBean的哪个属性进行比较,也不知道是比大,还是比小。因此,它必须把比较算法封装起来,交给使用者自己来实现。
有了上面的想法,JDK就这样来实现了。
首先,它定义了一个接口:
publicinterface Comparator {
publicint compare(Object node1,Object node2);
}
这样一个接口,它定义了使用者的输入参数,必须是两个对象进行比较;比较的结果必须返回一个int类型。
然后,sort方法就可以实现了,我假设JDK使用了一个简单的排序算法:
publicclass Collections {
publicstaticvoid sort(List list,Comparator comparator)
{
for(int i=0;i<list.size()-1;i++)
{
for(int j=i+1;j<list.size();j++)
{
if(comparator.compare(list.get(i), list.get(j))>0)
{
Object obj = list.get(i);
list.set(i, list.get(j));
list.set(j, obj);
}
}
}
}
}
上面,我就模拟了sort方法的实现过程,它使用的就是一个典型的策略模式。但是,我们在Groovy语言中,我只需要这么实现:
class Collections {
defstaticsort(List list,Closure closure)
{
(0..<list.size()-1).each{
i ->
(i+1..list.size()).each{
if(closure.call(list[i],list[it])>0)
{
def obj = list[i]
list[i] = list[j]
list[j] = obj
}
}
}
}
}
可以看到,在Groovy语言中的策略模式的实现省略了封装策略的接口,而使用闭包来代替了它。这样的用法当然更加方便和灵活。
如果有人认为使用接口更好,其实接口定义了一种契约,可以明确的告诉使用者它的输入参数和输出参数。而闭包则不能明确告诉使用者输入参数和输出参数。那么你也可以继续使用接口,但至少该接口的使用者可以更灵活一些,他可以使用闭包来实现你的接口,这也是闭包带来的好处。
其他的模式,如Command模式,也可以使用上述方法进行简化。其实,有很多时候,用闭包来代替接口是不大可能的,但是在Groovy语言种,我们确实能够使用闭包来实现接口,这样的实现比使用实体类来实现接口更为方便,比使用内部类来实现接口更为灵活。至于怎么来使用闭包实现接口,我在《Groovy探索之闭包 三》里面已经讲到过,这里就不再重述了。
分享到:
相关推荐
6. **Grails框架**:如果对Web开发感兴趣,Groovy的Grails框架是值得探索的。它是一个基于Groovy的全栈框架,提供MVC架构,用于快速构建Web应用。 7. ** Grape**:Grape是Groovy自带的依赖管理系统,类似于Java的...
#### 五、Groovy的IDE和编辑器支持 **1.5.1 集成IntelliJ IDEA** IntelliJ IDEA提供了全面的Groovy支持,包括代码提示、重构、调试等功能。 **1.5.2 Eclipse插件** Eclipse也支持Groovy开发,通过安装Groovy插件...
进一步探索Groovy的高级特性,如Meta Object Protocol (MOP)、GroovyShell、 Grape依赖管理系统等,提升编程技巧。 七、社区资源与工具 积极参与Groovy社区,利用官方文档、Stack Overflow、Groovy Slack等平台获取...
- **闭包**:Groovy的闭包是其强大的特性之一,它们可以作为函数参数,也可以用作控制结构的一部分,提供了高度的灵活性。 - **动态和静态类型**:Groovy允许在同一个程序中同时使用动态和静态类型,以平衡开发速度...
《Groovy in Action》这本书由Dierk König与Andrew Glover、Paul King、Guillaume Laforge以及Jon Skeet共同编写,是一本深入探索Groovy编程语言的权威指南。本书由Manning Publications出版,全面覆盖了Groovy语言...
- **闭包**:Groovy中的闭包类似于其他语言中的匿名函数,但具有更强的灵活性和表达能力。它们可以作为参数传递给方法,也可以作为返回值从方法中返回。 - **元编程**:Groovy提供了一系列强大的元编程工具,包括AST...
在"groovy_demo"项目中,我们将会探索Groovy的基础概念和核心特性,这对于初学者来说是一个很好的起点。下面将详细讨论Groovy的相关知识点。 1. **Groovy语法基础**: - **简洁性**:Groovy的语法比Java更为简洁,...
以上内容仅为Groovy入门的基础知识,Groovy还有更多高级特性如AST转换、GroovyShell、 Grape依赖管理等,等待你进一步探索。通过阅读《Groovy经典入门推荐版》PDF,你将能够全面了解这个语言,并迅速上手。
例如,Groovy支持闭包,这是一种强大的函数式编程概念,可以简化迭代和函数式操作。 Groovy与Java的互操作性是其一大亮点。由于Groovy代码可以无缝调用Java类库,开发者可以在已有的Java项目中轻松引入Groovy脚本,...
总的来说,"Groovy in Action"提供了全面的学习材料,配合API文档,可以帮助开发者迅速掌握Groovy的精髓,并将之应用到实际项目中。通过阅读这本书和实践其中的示例,你将能更好地理解和利用Groovy的强大力量,提升...
5. **高级主题**:涵盖Groovy 2中的新增特性,例如类型推断、静态类型检查等,以及如何使用Groovy构建领域特定语言(DSL)。 6. **案例研究**:通过实际案例展示如何将Groovy应用于构建脚本、测试框架等领域。 #### ...
《RxJava与Groovy结合:探索异步编程新境界》 RxJava,一款基于 Reactive Extensions 概念的库,为Java虚拟机(JVM)提供了一种声明式处理异步数据流的方式。它允许开发者以一种简洁、可读性强的方式来处理事件和...
Groovy是一种动态、灵活的编程语言,它在Java平台上运行,并与Java代码完全兼容。...通过学习和实践,你可以掌握使用Groovy开发简单交互式程序的技能,为进一步探索Groovy的高级特性和应用打下坚实的基础。
5. **类库和依赖**:包含Groovy运行时所需的类库和其他依赖,使开发者能够在各种环境中使用Groovy。 对于想要学习或升级到Groovy 3.0.3的开发者,你可以通过以下步骤开始: 1. 下载并解压"apache-groovy-sdk-3.0.3...
- **第5章:闭包的工作原理**:深入分析了Groovy中的闭包(Closures),这是Groovy的一个关键特性,闭包使得编写简洁而强大的代码成为可能。 - **第6章:Groovy控制结构**:讨论了各种控制流程语句,如循环、条件判断...
### Groovy学习笔记知识点概述 #### 一、Groovy简介及特性 **1.1 Groovy的概念** Groovy是一种强大的编程语言,它结合了Python、Ruby等...对于想要探索动态语言特性的Java开发者而言,Groovy无疑是一个极佳的选择。
3. **闭包**:Groovy中的闭包是其强大的特性之一,它可以被用作函数、数据结构和控制结构,类似于JavaScript的箭头函数。 4. **GString**:Groovy的GString(Groovy String)允许在字符串中嵌入表达式,使得字符串...
2. **闭包**: Groovy中的闭包类似于函数引用,可以作为参数传递,增强了代码的可读性和灵活性。 3. **方法调用简写**: 可以使用`.`或`[]`来调用对象的方法,如`object.method()`或`object['method']()`。 4. **...
- **闭包增强**:Groovy的闭包(Closure)是其强大特性之一,1.8.0可能对闭包的语法和行为进行了优化,使其更接近Java 8的Lambda表达式。 - **GDK增强**:Groovy的Default Groovy Methods (GDK) 是Groovy语言的一...