加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:58:52 所属栏目:大数据 来源:网络整理
导读:???????????? Groovy 探索之闭包 七 ? 使用闭包来实现模板方法模式 ? ? 我们知道,很多的设计模式都是通过增加接口来达到解耦的目的,使得代码的扩展性大大增强。其中,模板方法模式就是这样的。请看下面的例子。 假设我们有如下的两个类: class A { ??? ??

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

?

?

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

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

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...'

?????? }

???

?

运行结果为:

doing some common part...

doing a...

?

?

好了,到此为止,我们在Groovy语言中使用闭包来实现模板方法模式的实践已经完成。现在,我们再来看看原始的类A

class A {

???

??? public void doing()

??? {

?????? println 'doing some common part...'

??????

?????? println 'doing a...'

??? }

?

}

?

?

很单纯的一个类,我们的要求是将第一个“println”语言所代表的代码段和第二个“println”语言所代表的代码段分开实现。在Groovy语言中,一看到代码段这样的字眼,我们就应该想到它能够在一个闭包中被实现,而闭包对象又是能够被传递的。这就达到了实现模板方法模式的要求。这也就是我们使用闭包实现模板方法模式的理论基础。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读