请教一个责任链的问题

03-12-02 nitmithv
在阎宏的<java与模式>一书中说道"发出这个请求的客户端并不知道链上的那一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任."

但我地疑惑就在书中的两个例子中.

例1:

抽象处理类:Handler

具体处理类:ConcretHandler

client:

public class Client

{

static private Handler handler1,handler2;

public static void main(String args[])

{

handler1 = new ConcretHandler();

handler2 = new ConcretHandler();

handler1.setSuccessor(handler2);

handler1.handleRequest();

}

}

例2:<红楼梦>中击鼓传花

client:

public class DrumBeater

{

private static Player;

static public void main(String[] args)

{

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

player.handle(4);

}

}

在上述两个例子中,chain的组成顺序逻辑都是client决定的,如果要重新组织chain,client端

的代码势必要有改动.这与书中本章开始提到的"不影响客户端的情况下动态的重新组织链"矛盾.

请大家指点.

    

banq
2003-12-03 16:26
你分析得很深刻,而且你的怀疑是对的。

关于他的定义:

"发出这个请求的客户端并不知道链上的那一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任."

这段定义不是很精确,对于CoR,是在这样的前提下才能够使用:

处理请求者如果无法确定请求内容,或者需要将请求处理机制和请求内容解耦,才会使用CoR。

CoR基本和客户端没有什么关系,是事件处理机制的一种实现模式。

如果能够确定请求内容,那么直接使用Command模式是最快的,例如,如果你给你的请求加一个ID,并且规定,ID为1,调用command1.java;ID为2,调用command2.java,那么这就是Command模式了。

你提的这段代码,可以说是错误的,甚至是误导初学者。

在客户端中当然是不能进行CoR的排定设定。

windman
2003-12-03 17:21
责任链的最好范例就是servlet规范中的filter啦,那个是典型的责任链模式,你说得对,这两个不是责任链模式

furarmy
2003-12-04 13:16
关于《Java与模式》,我也想说几句。

上次参加UML培训,做练习时我做了一张用来表现神雕侠侣中各人之间关系的类图。老师说这样是不对的,像“杨过”“小龙女”这样的,不能作为一个个类存在于类图中,因为类是一类抽象的集合。其实道理很简单的,但应用在uml中就没有想到。后来我想,可能是受了“Java与模式”的影响,因为该书中大量这样的用法。如上面提到的红楼梦中各人物,都是这样表现出来的。

就好像我们平时确定类之间的关系,可以有公司、部门这样的抽象含义作为类,但肯定不会有“华为”“微软”这样的类。我觉得老师说的还是对的。所以,是否可以认为该书中这样的用法有失偏颇呢?

大家怎样看的。

richardluopeng
2003-12-04 15:40
提出异议:

怎么说在客户端不能设定COR 的顺序???

猜你喜欢
4Go 1 2 3 4 下一页