登陆注册
8183300000044

第44章 2 责任型模式

大B:“击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。”

小A:“哇!这就是责任链模式啊?听起来好像有点复杂喔。”

大B:“其实很简单的。责任链可能是一条直线、一个环链甚至一个树结构的一部分。”

小A:“这样一说好像很简单,但听起来好像很复杂似的。”

小A:“那你刚才说的红楼梦中击鼓传花的故事不是就是符合责任链模式吗?”

大B:“显然,击鼓传花符合责任链模式的定义。参加游戏的人是一个个的具体处理者对象,击鼓的人便是客户端对象。花代表酒令,是传向处理者的请求,每一个参加游戏的人在接到传来的花时,可选择的行为只有两个:一是将花向下传;一是执行酒令――喝酒。一个人不能既执行酒令,又向下家传花;当某一个人执行了酒令之后,游戏重新开始。击鼓的人并不知道最终是由哪一个做游戏的人执行酒令,当然执行酒令的人必然是做游戏的人们中的一个。”

大B:“单独考虑击鼓传花系统,那么像贾母、贾赦、贾政、贾宝玉和贾环等传花者均应当是‘具体传花者’的对象,而不应当是单独的类;但是责任链模式往往是建立在现有系统的基础之上的,因此链的结构和组成不由责任链模式本身决定。”

小A:“喔!是吗?”

大B:“系统的分析在《红楼梦》第七十五回里生动地描述了贾府里的一场击鼓传花游戏:‘贾母坐下,左垂首贾赦,贾珍,贾琏,贾蓉,右垂首贾政,宝玉,贾环,贾兰,团团围坐。贾母便命折一枝桂花来,命一媳妇在屏后击鼓传花。若花到谁手中,饮酒一杯。于是先从贾母起,次贾赦,一一接过。鼓声两转,恰恰在贾政手中住了,只得饮了酒。’这场游戏接着又把花传到了宝玉和贾赦手里,接着又传到了在贾环手里……如果用一个对象系统描述贾府,那么贾母、贾赦、贾政、贾宝玉和贾环等等就应当分别由一个个具体类代表,而这场击鼓传花游戏的类图,按照责任链模式。”

大B:换言之,在击鼓传花游戏里面,有下面的几种角色:抽象传花者,或Handler角色、定义出参加游戏的传花人要遵守的规则,也就是一个处理请求的接口和对下家的引用;具体传花者,或ConcreteHandler角色、每一个传花者都知道下家是谁,要么执行酒令,要么把花向下传。这个角色由贾母、贾赦、贾珍、贾琏、贾蓉、贾政、宝玉、贾环、贾兰等扮演。击鼓人,或Client角色、即行酒令的击鼓之人。《红楼梦》没有给出此人的具体姓名,只是说由一媳大B:可以看出,击鼓传花游戏满足责任链模式的定义,是纯的责任链模式的例子。击鼓传花的类图完全符合责任链模式的定义的类图给出了这些类的具体接口设计。不难看出,DrumBeater(击鼓者)、Player(传花者)、JiaMu(贾母)、JiaShe(贾赦)、JiaZheng(贾政)、JiaBaoYu(宝玉)、JiaHuan(贾环)等组成这个系统。

下面是客户端类DrumBeater的源代码:

public class DrumBeater

{

private static Player player;

static public void main(String[]args)

{

player=new JiaMu(new JiaShe(new JiaZheng(new JiaBaoYu(new JiaHuan(null)))));

player。handle(4);

}

}

代码清单1、DrumBeater的源代码。

abstract class Player

{

abstract public void handle(int i);

private Player successor;

public Player(){successor=null;

}

protected void setSuccessor(Player aSuccessor)

{

successor=aSuccessor;

}

public void next(int index)

{

if(successor!=null)

{

successor。handle(index);

}

else

{

System。out。println(“rogram terminated。”);

}

}

}

代码清单2、抽象传花者Play类的源代码。

大B:“抽象类Player给出了两个方法的实现,以格式setSuccessor(),另一个是next()。前者用来设置一个传花者对象的下家,后者用来将酒令传给下家。Player类给出了一个抽象方法handle(),代表执行酒令。”

下面的这些具体传花者类将给出handle()方法的实现。

class JiaMu extends Player

{

public JiaMu(Player aSuccessor)

{

this。setSuccessor(aSuccessor);

}

public void handle(int i)

{

if(i……1)

{

System。out。println(“Jia Mu gotta drink!”);

}

else

{

System。out。println(“Jia Mu passed!”);next(i);

}

}

}

代码清单3、代表贾母的JiaMu类的源代码。

class JiaShe extends Player

{

public JiaShe(Player aSuccessor)

{

this。setSuccessor(aSuccessor);

}

public void handle(int i)

{

if(i……2)

{

System。out。println(“Jia She gotta drink!”);

}

else

{

System。out。println(“Jia She passed!”);

next(i);

}

}

}

代码清单4、代表贾赦的JiaShe类的源代码。

class JiaZheng extends Player

{

public JiaZheng(Player aSuccessor)

{

this。setSuccessor(aSuccessor);

}

public void handle(int i)

{

if(i……3)

{

System。out。println(“Jia Zheng gotta drink!”);

}

else

{

System。out。println(“Jia Zheng passed!”);

next(i);

}

}

}

代码清单5、代表贾政的JiaZheng类的源代码。

class JiaBaoYu extends Player

{

public JiaBaoYu(Player aSuccessor)

{

this。setSuccessor(aSuccessor);

}

public void handle(int i)

{

if(i……4)

{

System。out。println(“Jia Bao Yu gotta drink!”);

}

else

{

System。out。println(“Jia Bao Yu passed!”);

next(i);

}

}

}

代码清单6、代表贾宝玉的JiaBaoYu类的源代码。

class JiaHuan extends Player

{

public JiaHuan(Player aSuccessor)

{

this。setSuccessor(aSuccessor);

}

public void handle(int i)

{

if(i……5)

{

System。out。println(“Jia Huan gotta drink!”);

}

else

{

System。out。println(“Jia Huan passed!”);

next(i);

}

}

}

代码清单7、代表贾环的JiaHuan类的源代码。

大B:“可以看出,DrumBeater设定了责任链的成员和他们的顺序:责任链由贾母开始到贾环,周而复始。JiaMu类、JiaShe类、JiaZheng类、JiaBaoYu类与JiaHuan类均是抽象传花者Player类的子类。实现的DrumBeater类在把请求传给贾母时,实际上指定了由4号传花者处理酒令。虽然DrumBeater并不知道哪一个传花者类持有号码4,但是这个号码在本系统一开始就写死的。这当然并不符合击鼓传花游戏的精神,因为这个游戏实际上要求有两个同时进行的过程:击鼓过程和传花过程。击鼓应当是定时停止的,当击鼓停止时,执行酒令者就确定了。”

同类推荐
  • 爱上我的“手机女友”

    爱上我的“手机女友”

    本书共有五个部分:第一章:千娇百媚的我—手机门类大搜索第二章:了解我的心—手机“芯”理学第三章:不一样的我不一样的美—手机的万种风情第四章:命中注定我爱你—神秘手机星座解读第五章:有求必应贴心女友—手机的绝世武功通过这本书,想要购入手机的你会知道哪款手机女友更适合你,已有心仪手机的你可以让手机女友懂得更多变得更聪明。希望这本书能够帮助你在手机选购上和手机使用上更舒心、安心、贴心。
  • 中国移动智能手机的秘密

    中国移动智能手机的秘密

    《中国移动智能手机的秘密》是一本关于移动终端和移动互联网的科普书。作者将这18年通信行业中的学习、思考、实践积累成《中国移动智能手机的秘密》与大家分享。书本系统总结了手机的发展历史、TD产业界“从2G向3G演进”的移动终端产业分化重组进程、智能手机的使用方法用方法和应用指南,以及对移动互联网发展独特思考。
  • 信息安全

    信息安全

    我们不得不看到,全球信息化发展,使信息安全成为维护国家安全的重要屏障,信息安全问题正在为国与国之间带来新的制约关系。当然,这只是我们强调信息安全极端重要性的一个原因。事实上,信息安全已经上升为国家安全的重要组成部分,这是信息时代国家安全的明显特征,也是很多国家的共识。但与其他国家安全元素不同,如果脱离信息化发展的环境,“信息安全”只是一个抽象的目标,它要通过对国家的政治、经济、文化等方面的影响体现其对国家安全的意义,并以保障信息化发展为目标取向。因此,我们说信息安全是信息时代国家安全的基石。
  • Delphi程序设计教程

    Delphi程序设计教程

    本书为适应不同层次读者的需要,从Delphi的基本知识讲起,由浅入深,全面讲述了Delphi的集成开发环境、Delphi的编程语言——ObjectPascal、常用组件的使用、窗体的设计、菜单的设计、对话框的设计、多文档界面程序的设计、多媒体编程和数据库应用程序设计等内容。
  • 公开时刻

    公开时刻

    本书从传播者分析,内容分析,媒介分析受众与效果分析,传播环境与传播控制分析等几大方面把汶川地震作为重大传播案例,阐释汶川地震的传播学遗产。对政府部门和新闻媒体在危机公关方面做出正面评价。
热门推荐
  • 神妃在上:妖孽邪王盛世宠

    神妃在上:妖孽邪王盛世宠

    【男女双强双洁,爽文宠文,双双腹黑无极限,不喜慎入】她,是风云大陆天纵之才,铁血杀伐,凤飞九天,一出蓄谋已久的背叛,她葬身蛮荒古域尸骨无存。她,是南辰国武安侯凤家三小姐,天生废材,灵脉尽碎,玄气全无,被所谓的亲人欺凌至死。当她变成了她,凤眸骤睁,天生废材?呵呵!殊不知她体内的灵脉乃这风云大陆举世无双比神品还要好的绝品凤脉!一朝凤脉现,从此御灵兽,斗渣伯渣婶,虐渣堂姐妹,炼神丹,走魔林,跨四海,一双素手,一根银针,活死人肉白骨。九星驳妖师是天才?呵呵!在她这个神级驳妖师面前,一切都是浮云!
  • 斗罗之唐银

    斗罗之唐银

    唐银很幸运,因为他是唐三的弟弟,啸天斗罗是他爸爸,昊天斗罗是他二叔。
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 落难姐弟恶魔记

    落难姐弟恶魔记

    这是一段发生在月瑶、碧游、星晟三大帝国,西域不夜城、南海琉璃宫、九幽玄冥宫三大暗黑组织之间的阴谋故事。各大主角几乎人人身份多重且极其神秘。女一号:沫涵——月瑶帝国公主(身世诡异)男一号:玄逸——星辰帝国皇子(身份多重,他还是……)男二号:沫凌——沫涵之弟(表面单纯实则凶狠型少年)男三号:易忻——碧游帝国王的小儿子,可爱的16岁少年男四号:子洛——九幽玄冥宫少主(冷,一直寻找其弟)女二号:伊茜——易忻的二姐,美丽大方,实则……男五号:风液——川界的幼弟,双重性格,外表放浪不羁,实则……羽泓、羽澈、易轩、川界、剑锋、流舞、栎冰、秋篱、沐兮、易铭、伊莲、映竹
  • 凤霸天下:妖孽鬼帝抱上床

    凤霸天下:妖孽鬼帝抱上床

    “大白天的不穿衣服躺床上,你想干啥?”某女汗颜道。“干你。”“……”
  • 惊世盛宠之王妃要改嫁

    惊世盛宠之王妃要改嫁

    虞皓玥因飞机失事莫名穿越,醒来后成了凤岚的公主,为了平息两国的战争,自己被逼送去和亲,成了龙越国睿王的王妃,本以为此路前去坎坷,没想到睿王把她宠上了天,连皇位他为了她,想要就夺,想不要就丢,这个一个宠妻成狂的男人为自己爱的女人创天下的故事!本文纯属虚构,请勿模仿。
  • 生化战争:代号1

    生化战争:代号1

    2016年,全面战争打响,各国的战争一直在持续。2017年,生化武器诞生。2018年,日本采用核武器和最新研发的巨炮还击。2019年,美国,日本,意大利等国家覆灭。战争大幅度降低。2020年,战争停止,所有国家的政府几乎瞬间瓦解,丧尸横行......
  • 总经理PE一本通封

    总经理PE一本通封

    本书专为中小企业总经理量身打造,全面细致地讲述您所关心的私募融资途径,围绕私募融资利弊、时机、流程、机构、企业引入与退出等核心问题,结合真实生动的案例,将PE融资的实战经验与操作技巧一一呈现。
  • 借年华

    借年华

    过去无法完成,现在也是错过,那就向历史借一段年华,留给未来!
  • 总裁无所不能的超甜小娇妻

    总裁无所不能的超甜小娇妻

    四年前的一场意外和一次邂逅,将所有人的命运联系在一起。初见,女孩溜进大别墅,终于找到一个没摄像头的地方翻进他家院子,被当场抓包却来了句“嗨?”还厚颜无耻的要了微信?说是没带现金扫码支付?男人无语的笑了笑,他亲眼看见女孩刚刚把现金都藏进后院,却还是纵容她,让她加了自己的微信。说是不干涉她的工作,却暗自收买弟弟让她进了当代最优秀的WN娱乐,一路陪伴,从十八线小女星到娱乐圈天后,从个小游戏迷到电竞圈女神,他始终都在。宠她噬命。很久后的某一天,他把她抱在怀里:“你知道为什么当初你偏偏翻进的是我家院子吗?你知道为什么鸢尾别墅会出现监控死角的地方吗?因为,在你来的那一刻,是我把那个监控拆了。”