在Tapestry的文档中,关于Listener Methods有这么一段话:
Delegate在Java语言中并非“一等公民”,但采用OO思维很容易实现它。还是先来看看Tapestry把Delegate派何用场吧,建立个感性认识:
关于Delegate的讲解,还是看看《应用框架的设计与实现》一书是怎么讲的吧:
-------下列内容引自《应用框架的设计与实现》一书------------
委托乍看有点儿难于理解,这是因为它调用方法的思路不同于常规。简言之,委托是以面向对象的方式来调用方法,图7-1说明了常规的方法调用和委托之间的区别。
图7-1 常规方法调用与通过委托的方法调用之间的比较
使用常规方法调用时,你需要创建一个包含待调用方法的对象,然后调用该方法,并传递它需要的参数。其中,指定要调用哪个对象的哪个方法,和调用方法本身,是 “一下子”完成的。然而,通过委托来进行方法调用则不同,它将“方法调用的定义”和“方法的调用”区分开来。仔细观察图7-1,有一个delegate的实例,它封装了调用方法所必须的方法信息。使用委托来调用方法包括三步:定义委托对象,创建委托实例,再调用委托实例。我们知道,委托本质上是为“方法” 本身建立的对象,它和我们大部分代码中的“方法”感觉上有很大不同。
-------上面内容引自《应用框架的设计与实现》一书------------
注意啦,Delegate堂而皇之地作为“一等公民”在C#中“直接支持”,而Tapestry这样的Java社区的著名项目又“转而采用”,给个理由先?答案是:它提供的这种两个对象之间的这种间接(indirection)关系,对平台级软件、以及auto wire特别重要的软件,简直太有用了。
你要是说采用“常规Listener方法”也“差不多”呀,我要问了:差不多是差多少?研读研读Tapestry本身吧!它同时采用了“常规 Listener方法”和“基于Delegate的Listener方法”,你以为Howard这样的架构师会是“靠拍脑袋来设计的人”吗?!