快速业务通道

Java模式开发之责任链模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
能既执行酒令,又向下家传花;当某一个人执行了酒令之后,游戏重新开始。击鼓的人并不知道最终是由哪一个做游戏的人执行酒令,当然执行酒令的人必然是做游戏的人们中的一个。

击鼓传花的类图结构如下:

Java模式开发之责任链模式 - 编程入门网

图5、击鼓传花系统的类图定义。

Java模式开发之责任链模式(4)

时间:2009-12-15

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

系统的分析  在《红楼梦》第七十五回里生动地描述了贾府里的一场击鼓传花游戏:“贾母坐下,左垂首贾赦,贾珍,贾琏,贾蓉,右垂首贾政,宝玉,贾环,贾兰,团团围坐。...贾母便命折一枝桂花来,命一媳妇在屏后击鼓传花。若花到谁手中,饮酒一杯...于是先从贾母起,次贾赦,一一接过。鼓声两转,恰恰在贾政手中住了,只得饮了酒。”这场游戏接着又把花传到了宝玉和贾赦手里,接着又传到了在贾环手里...

如果用一个对象系统描述贾府,那么贾母、贾赦、贾政、贾宝玉和贾环等等就应当分别由一个个具体类代表,而这场击鼓传花游戏的类图,按照责任链模式,应当如下图所示:

Java模式开发之责任链模式 - 编程入门网

图6、红楼梦中的击鼓传花游戏的示意性类图。

换言之,在击鼓传花游戏里面,有下面的几种角色:

抽象传花者,或Handler角色、定义出参加游戏的传花人要遵守的规则,也就是一个处理请求的接口 和对下家的引用;

具体传花者,或ConcreteHandler角色、每一个传花者都知道下家是谁,要么执行酒令,要么把花 向下传。这个角色由贾母、贾赦、贾珍、贾琏、贾蓉、贾政、宝玉、贾环、贾兰等扮演。

击鼓人,或Client角色、即行酒令的击鼓之人。《红楼梦》没有给出此人的具体姓名,只是说由“一 媳妇”扮演。

Java模式开发之责任链模式 - 编程入门网

图7、贾府这次击鼓传花的示意性对象图。

可以看出,击鼓传花游戏满足责任链模式的定义,是纯的责任链模式的例子。

Java系统的解  下面的类图给出了这些类的具体接口设计。读者不难看出,DrumBeater(击鼓者)、Player(传花者)、JiaMu(贾母)、JiaShe(贾赦)、JiaZheng(贾政)、JiaBaoYu(宝玉)、JiaHuan(贾环)等组成这个系统。

Java模式开发之责任链模式 - 编程入门网

图8、击鼓传花的类图完全符合责任链模式的定义。

下面是客户端类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); } }

代码清单5、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("Program terminated."); } } }

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

Java模式开发之责任链模式(5)

时间:2009-12-15

抽象类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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号