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)
}
}

}

时间: 2024-09-10 05:56:09

Groovy探索之责任链模式的相关文章

Groovy探索 自定义Range 三 自定义Range与责任链模式

责任链模式也是我们比较常用的一种模式,我在<Groovy探索之责任链模式>中有个探索.大家也可以在网上搜索,应该有很多这方面的文章. 在这里,我们将使用自定义的Range类来实现责任链模式,使用的例子还是在<Groovy探索之责任链模式>一文中所谈到的"孙悟空大战二郎神"的这个情节.这样,我们可以把这两篇的文字结合起来看,使得我们能够对比这两种开发方式.使得我们能够深入的理解自定义Range类的使用. 在"孙悟空大战二郎神"这个情节里,重点讲

深入浅出基于Java的责任链模式

一.引言 初看责任链模式,心里不禁想起了一个以前听过的相声:看牙.说的是一个病人看牙的时候,医生不小心把拔下的一个牙掉进了病人嗓子里.病人因此楼上楼下的跑了好多科室,最后无果而终. 责任链模式就是这种"推卸"责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象.至于到底谁解决了这个问题了呢?我管呢! 二.定义与结构 从名字上大概也能猜出这个模式的大概模样--系统中将会存在多个有类似处理能力的对象.当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的&qu

Java模式开发之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 开发之责任链

责任链模式

package pattern.chainofresponsibility; /** * 责任链模式:Chain of Responsibility * @version 2009-5-9 * @author Winty(wintys@gmail.com) */ public class ChainOfResponsibilityTest{ public static void main(String[] args){ Handler handler1 = new ConcreteHandler

浅谈简单工作流设计——责任链模式配合策略与命令模式的实现

本文以项目中的一个工作流模块,演示责任链模式.策略模式.命令模式的组合实现! 流程简介 最近在做的一个项目,涉及到的是一个流程性质的需求.关于工程机械行业的服务流程:服务任务流程和备件发运流程. 项目之初,需求不是很清晰,算是演化模型吧.先出一个简单版本,然后根据用户的使用情况,再进一步探测新需求.所以也就是说这两个流程中的每一步暂时都不是固定的,而应该是可配置.可增减的. 目前暂定的两个流程示意图如下: 以上为两个流程的大致过程,当然实际过程中,可能还要走其他的流程. 但是,仔细分析,你会看到

ServiceLoader服务提供者模式,实现动态插件加载,类责任链模式

Edit ServiceLoader服务提供者模式,实现动态插件加载,类责任链模式 ServiceLoader的功能比ClassLoader简单,它可以帮我们获取所有实现了某接口或基类的类.当然前提是ClassLoader已经加载过的类.举个例子: 定义一个接口: public interface IService { public String sayHello(); public String getScheme(); } 以及两个实现类: public class HDFSService

跟屌丝学设计模式之责任链模式

JAVA之责任链模式 原文地址:http://itzyx.com/index.php/java_zrl/ 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的:  责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和

详解java设计模式之责任链模式

从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 假比说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又由贾宝玉传给贾环,由贾环传回给贾母,如此往复(见下图).当鼓声停止时,手中有花的人就得执行酒令. 图1.击鼓传

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器     前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式--状态模式允许通过改变对象的内部状态而改变对象自身的行为,