Groovy探索之责任链模式
责任链模式在现实中也有很多对应的实例。
比方说,一个公司有A,B,C,D四个项目组,各自相邻。一天,一个客户打电话进来,说我们某某项目出了点问题,请帮忙解决。电话是由A项目组的人接的,A项目组的人一听,说这不是我们负责的项目,我们把它交给B项目组吧。B项目组的人一听,也说,这也不是我们项目组负责的,我们把它交给C项目组吧。C项目组的人一听,说,这是我们负责的项目,我们来处理吧。
上面的实例很形象的表现了一个责任链模式的处理过程:一个项目或过程里有多个相似的责任,分别由各自的处理模块来处理;我们的解决方法就是将这些所有的处理模块组成一个链;然后,当一个责任发生时,将这个责任沿着链流转,如果当前处理模块不处理该责任,则把该责任流转到链的下一个处理模块,依此类推,直到该责任找到处理模块为止。
我们都爱读《西游记》这部小说,其中有一个情节是"孙悟空大战二郎神",相信大家都很熟悉。
小说里是这么描述的:
"悟空见自己的老窝被破坏了,心里一慌,变成麻雀想跑,二郎神摇身变成了捉麻雀的鹰,
抖抖翅膀就去啄麻雀;悟空急忙又变成一只大鹚鸟,冲向天空,二郎神急忙变成了一只大海鹤,
钻进云里去扑;悟空一见嗖地一声飞到水里,变成一条鱼。
二郎神从照妖镜里看见了悟空,就变成鱼鹰,在水面上等着,悟空见了,
急忙变条水蛇,窜到岸边,接着又变成花鸨,立在芦苇上。二郎神见他变的太低贱,也不去理他,
变回原来的样子,取出弹弓,朝着花鸨就打,把悟空打得站立不稳。"
这是其中的一段二人的变幻大战,描写的很精彩。其中,孙悟空分别变幻成"麻雀"、"大鹚鸟"、"鱼",企图躲过二郎神的眼睛,达到逃跑的目的。而二郎神也分别变幻成"鹰"、"大海鹤"、"鱼鹰"来和孙悟空争锋相对。
从上面的分析,如果把二郎神对付孙悟空当做一个过程,那么孙悟空的三个变幻就是三种不同的职责,而二郎神也通过三个不同的处理模块来对付它们。
那么,我们就可以通过责任链模式来模拟二郎神和孙悟空的这段变幻大战了。
首先,二郎神的第一个处理模块是"鹰":
class Hawk {
def next
def Hawk(next)
{
this.next = next
}
def fight(wukong)
{
if(wukong == 'sparrow')
{
println 'hawk eat sparrow!'
}
else
{
this.next.fight(wukong)
}
}
}
在这个"Hawk"类中,只有一个属性是"next",指向它的下一个处理模块。当这个类初始化的时候确定它的下一个处理模块是什么。
然后,我们看它的"fight"方法,有一个传入参数"wukong",代表的是孙悟空的当前变幻,如果它的当前变幻是"麻雀"的话,就被"Hawk"处理;如果不是的话,"Hawk"类就会传给下一个处理模块来处理。
当然,二郎神的第二个处理模块"大海鹤"的功能也跟第一处理模块相似:
class Crane {
def next
def Crane(next)
{
this.next = next
}
def fight(wukong)
{
if(wukong == 'cormorant')
{
println 'crane eat cormorant!'
}
else
{
this.next.fight(wukong)
}
}
}
可以看到,功能跟"Hawk"类一样,在这里我们就不多说了。同样的还有一个:
class Osprey {
def next
def Osprey(next)
{
this.next = next
}
def fight(wukong)
{
if(wukong == 'fish')
{
println 'osprey eat fish'
}
else
{
this.next.fight(wukong)
}
}
}
这个类也没有什么可说的,但是,在责任链模式中,还有一个类是必须的,这就是默认的处理模块,它的作用是处理当这个责任链流转结束的时候,仍然没有找到适合的处理模块的话,就交给默认的处理模块来处理。它的作用实际上是使得这个责任链能够正常流转处理结束。
在这里,我们的默认处理模块是判给孙悟空赢,如下:
class Other {
def fight()
{
println 'wukong win!'
}
}
现在,整个责任链宣告完成,我们需要写一个客户端代码来测试它。
def wukong = 'fish'
def erlangshen = new Hawk(new Osprey(new Crane(new Other())))
erlangshen.fight(wukong)
在我们的客户端代码中,孙悟空的变幻是一条"鱼":
def wukong = 'fish'
而二郎神则有一个变幻的责任链:
def erlangshen = new Hawk(new Osprey(new Crane(new Other())))
下面二郎神就要大战孙悟空了:
erlangshen.fight(wukong)
它的运行结果为:
osprey eat fish
分享到:
相关推荐
groovy入门经典,groovyeclipse 插件
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
Groovy
Groovy是Java平台的一个崭新的语言,它为Java带来了许多使Ruby流行的特征。《Groovy in Action》是Groovy编程的综合指南,它向Java开发者介绍了...Groovy专家可以获得一个对他们进行全面和创造性Groovy探索的可靠参考。
groovy
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
Groovy轻松入门—搭建Groovy开发环境 Groovy轻松入门—搭建Groovy开发环境
groovy的帮助文档 !!!!!
Groovy语法系列教程之注释.zip Groovy语法系列教程之注释.zip Groovy语法系列教程之注释.zip Groovy语法系列教程之注释.zip
Groovy jar包 3.0.
groovy-2.3.6-installer windows安装版本
groovy 源码
groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2
什么是 Groovy? Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,...
Groovy 教程。简单的groovy教程。
Groovy in Action, Second Edition is the undisputed definitive reference on the Groovy language. Written by core members of the Groovy language team, this book presents Groovy like no other can—from ...
Groovy_快速入门,对于初学groovy的很有帮助,值得学习