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入门]第五讲.将流程控制语句与方法重构为闭包
groovy(10)-闭包委托策略 /*闭包的三个重要变量:this,owner,delegate区别在于:this代表闭包定义处最近的对象(不包含闭包),ow
了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合、内置正则表达式和闭包。编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,...
Groovy提供类似于Java的语法结构,本地化支持映射和列表、方法、类,闭包和构造器等结构。由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。 相对于Java语言,...
这个代码包是老师上课给我们的,感觉对于初学者来说非常实用,里面包含了基本语法,包括字符串,整数,小数,数组,闭包等待,让你快速入门
使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。 Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别...
了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合、内置正则表达式和闭包。编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,...
Groovy提供类似于Java的语法结构,本地化支持映射和列表、方法、类,闭包和构造器等结构。由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。, 相对于Java语言,...
使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。 Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别...
Groovy学习笔记,内容如下: 1.概念 2.基本语法 3.字符串 4.集合 5.类和闭包 6.控制语句 7.操作符重载 8.I/O操作 9.高级应用 10.正则表达式
为了推广学习groovy,低分提供给大家! 运行在Java虚拟机上,敏捷、动态的语言 建立在Java的基础上,同时,吸收了其他语言的优点,比如:Python、 Ruby 和 Smalltalk Java开发人员,上手快,几乎没有学习...
Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的...使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。 本书是一本不错的Groovy入门、深入教材,提供了大量代码范例和解决方案。
本教程适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java™ 开发人员。了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合、内置正则表达式和闭包。
Groovy简介 Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了...使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。 Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上
在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python等语言中都能找到对闭包不同程度的支持。 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言这意味着不仅要表示数据还要表示...
译注:原文作者比较火星,我不了解 Groovy 以及 Scala 语言,所以这里我加上 Javascript 的实现。 在开始之前先说明下,本例子仅仅是阐明观点,并没有考虑性能等其他方面的因素。 “货比三家” 用个简单的例子开始...
第1章 寻找grails之旅 1.1 java的困惑 1.2 webc2.0时代 1.3 java的力量 1.4 什么是grails 1.4.1 与java集成 1.4.2 简单而强大 1.4.3 吸取的经验教训 1.5 使用grails的原因 ...
如果您使用Groovy,则本项目旨在提供另一种方法来使用vert-web定义网络路由,这种方式更具Groovy风格。 最有趣的功能是能够使用嵌套闭包以嵌套方式声明路由器和子路由器。 看一下中的routes.groovy , routes....