`
ihuashao
  • 浏览: 4745013 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Groovy探索之闭包 七 使用闭包来实现模板方法模式

阅读更多

Groovy探索之闭包 使用闭包来实现模板方法模式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

我们知道,很多的设计模式都是通过增加接口来达到解耦的目的,使得代码的扩展性大大增强。其中,模板方法模式就是这样的。请看下面的例子。

假设我们有如下的两个类:

class A {

public void doing()

{

println 'doing some common part...'

println 'doing a...'

}

}

class B {

public void doing()

{

println 'doing some common part...'

println 'doing b...'

}

}

在这两个类的“doing”方法中,第一个“println”语句代表的是他们的共同的功能,第二个“println”语句则代表的是他们各自的功能。

看到了上面的两个类,我们会很自然的使用模板方法模式来解耦他们。

首先,我们设计一个抽象类来模拟所以的类:

abstract class DoingAll {

def void doing()

{

println 'doing some common part...'

doOther()

}

protected abstract void doOther();

}

在这个类中,我们先将所有类的共同功能在“doing”方法里实现,然后调用一个抽象方法,当然,这个抽象方法留给各个类自己实现。如下:

class A extends DoingAll{

protected void doOther()

{

println 'doing a...'

}

}

class B extends DoingAll{

protected void doOther()

{

println 'doing b...'

}

}

上面的代码就是一个完整的模板方法的实现。它的特点就是将共同的功能放在父类里实现,将各自的功能放在各自的子类里实现。正是由于模板方法的这个特点,使得它既简单又实用,在我们的编码过程中经常用到它。

但是,就是这样一个简单的模板方法模式,在我们的Groovy语言中,还有更加简单、更加直观的实现,这就是使用闭包。

我们先来看类A

class A {

public void doing()

{

println 'doing some common part...'

println 'doing a...'

}

}

我们可以把第二个“println”语句移出来作为一个独立的方法,用以表示各自类的方法中的不同功能,如下:

class A {

public void doing()

{

println 'doing some common part...'

doOther()

}

protected void doOther()

{

println 'doing a...'

}

}

这样的想法很简单,而且也好像没什么意义。但是,如果把“doOther”方法稍稍改动一下,把它改为一个闭包,如下:

class A {

public void doing()

{

println 'doing some common part...'

doOther()

}

protected void doOther =

{

println 'doing a...'

}

}

这当然也是没问题的,改造过后的类A没有任何错误。但是,代码的性质却发生了改变。发生了什么变化?我们来看看类A的“doing”方法的实现:

public void doing()

{

println 'doing some common part...'

doOther()

}

好像代码没有什么变化,但是确实是发生了变化,语句“doOther()”调用了一个闭包,而不是一个简单的方法。是调用了闭包又怎么样呢?

我们知道,如果是调用了闭包,闭包又是一个对象,可以作为参数到处传递。即我们可以把上面的“doing”方法改造成如下的样子:

public void doing(doOther)

{

println 'doing some common part...'

doOther()

}

有了上面的想法,我们就可以把父类改造成如下的样子:

class DothingClosure {

def void doing(callable)

{

println 'doing some common part...'

callable()

}

}

这样,我们的子类就可以写成下面的样子:

class DoAClosure extends DothingClosure{

def void doing()

{

super.doing(doA)

}

private def doA =

{

println 'doing a...'

}

}

我们来测试一下这种方式实现的模板方法模式:

def doA = new DoAClosure()

doA.doing()

结果为:

doing some common part...

doing a...

当然了,我们也可以完全不要实现子类,直接在使用的时候实现闭包的动作就行。如下:

def doA = new DothingClosure()

doA.doing{

println 'doing a...'

}

运行结果为:

margin: 0cm 0cm 0pt; text-align:

分享到:
评论

相关推荐

    [Groovy入门]第五讲.将流程控制语句与方法重构为闭包

    对于条件语句,如`if`,我们可以使用`find`、`any`或`collect`等方法结合闭包来实现。比如查找数组中的偶数: ```groovy def numbers = [1, 2, 3, 4, 5] def evenNumbers = numbers.findAll { it % 2 == 0 } // ...

    groovy模板

    Groovy提供了简单的方法来处理文件和目录。这些Groovy文件可能包含了读取、写入、移动或操作其他文件的代码,如`Guangfa201602.groovy`可能涉及广发银行2016年2月的数据处理。 综上所述,这个压缩包中的Groovy文件...

    [Groovy入门]第十讲.使用模板引擎开发界面

    作为Java开发者扩展能力的工具,Groovy提供了许多简化编程任务的功能,包括面向切面编程(AOP)、闭包以及内置的模板引擎,使得开发更加高效。在本讲中,我们将深入探讨如何利用Groovy的模板引擎来开发用户界面。 ...

    groovy(10)-闭包委托策略1

    在Groovy语言中,闭包是一种强大的特性,它允许我们创建可执行的代码块,并可以在不同的上下文中使用。闭包有三个重要的变量:`this`, `owner`, 和 `delegate`,它们各自扮演着不同的角色。 1. **this**: `this`...

    groovy入门实例代码详细(包括字符串,map,闭包等等)

    本入门实例代码详细地涵盖了Groovy的一些核心概念和常用特性,包括字符串操作、Map的使用以及闭包等。 1. **字符串操作**: - Groovy中的字符串可以是单引号或双引号包裹的。双引号中的变量可以直接展开,单引号则...

    Groovy安装以及简单使用

    在Groovy中,`each`方法接收一个闭包作为参数,这个闭包对数组中的每个元素进行操作。上面的代码会打印出每个数字的两倍值。 Groovy与Java的集成非常紧密,可以通过`@groovy.transform.CompileStatic`注解实现静态...

    groovy in action 中文版 2017.11

    脚本编写人员可以使用Groovy来编写自动化任务和系统管理工具,而不需要像在传统的Java程序中那样编写大量的模板代码。同时,Groovy也特别适合敏捷开发人员,因为它支持快速开发和频繁的迭代,使得敏捷开发流程中的...

    Groovy在Spring中的简单使用

    在测试中,可以使用 Spring 的 ApplicationContext 来获取 helloWorldService bean,并调用其 sayHello 方法,以验证 Groovy 脚本的正确性。 Groovy 在 Spring 中的使用可以带来许多好处,例如可以动态修改业务逻辑...

    Groovy Script 入门

    3. **闭包支持**:闭包是Groovy的一个强大特性,它可以像对象一样被传递和存储,用于实现高级编程模式。 4. **元编程**:Groovy支持元编程,可以通过反射机制修改程序的行为。 5. **简洁的语法**:Groovy具有简洁的...

    groovy入门经典,groovyeclipse 插件

    Groovy也支持使用`def`关键字来定义未指定类型的变量。 闭包是Groovy的一个核心特性,它类似于函数指针,可以被用作参数传递或者作为返回值。闭包在Groovy中的定义形式通常为`{参数列表 -&gt; 代码块}`。闭包的this...

    Java中使用Groovy的三种方式

    总结来说,Java开发中使用Groovy可以提升开发效率,简化代码,增强灵活性。无论是作为嵌入式脚本快速实现功能,还是作为类库扩展Java项目,或者是在Grails或Spring Boot框架中使用,Groovy都能为Java开发者带来诸多...

    groovy基础语法.pdf

    Groovy内置了对正则表达式的支持,提供了大量的方法来匹配、查找和替换字符串中的模式。 异常处理: Groovy中的异常处理与Java类似,可以使用try-catch-finally语句块来捕获和处理异常。Groovy还提供了一些便捷的...

    Z2-Groovy in Action.pdf

    Groovy闭包可以像方法一样被调用,也可以作为参数传递给其他方法。闭包中可以自由地访问它被创建时作用域中的变量(闭包的自由变量)。这为Groovy的编程提供了很大的灵活性,例如可以轻松实现事件监听、回调函数、...

    groovy

    3. 支持闭包:Groovy中的闭包类似于函数引用,可作为参数传递,有助于实现函数式编程风格。 4. GString:类似于Java的字符串,但支持占位符表达式,使字符串操作更便捷。 5. 链式调用:对象属性和方法可以连续调用,...

    Groovy1.8 beta 官方文档-1269页

    文档中会详细介绍如何使用Groovy来创建Grails应用,包括路由规则、服务、控制器、域类以及GSP(Groovy Server Pages)模板引擎的使用。 Groovy的闭包(Closure)是其强大的特性之一,它们可以作为函数传递,实现...

    groovy速查手册

    - **函数与方法**:支持定义函数和方法,包括闭包的使用,闭包是Groovy的一个强大特性,它允许创建可传递的匿名函数。 - **异常处理**:提供异常处理机制,如`try-catch-finally`块。 #### 四、运算符 Groovy支持...

Global site tag (gtag.js) - Google Analytics