注意啦,Delegate堂而皇之地作為“一等公民”在C#中“直接支持”,而Tapestry這樣的Java社區(qū)的著名項目又“轉(zhuǎn)而采用”,給個理由先?
在Tapestry的文檔中,關于Listener Methods有這么一段話:
Delegate在Java語言中并非“一等公民”,但采用OO思維很容易實現(xiàn)它。還是先來看看Tapestry把Delegate派何用場吧,建立個感性認識:
關于Delegate的講解,還是看看《應用框架的設計與實現(xiàn)》一書是怎么講的吧:
-------下列內(nèi)容引自《應用框架的設計與實現(xiàn)》一書------------
委托乍看有點兒難于理解,這是因為它調(diào)用方法的思路不同于常規(guī)。簡言之,委托是以面向?qū)ο蟮姆绞絹碚{(diào)用方法,圖7-1說明了常規(guī)的方法調(diào)用和委托之間的區(qū)別。
圖7-1 常規(guī)方法調(diào)用與通過委托的方法調(diào)用之間的比較
使用常規(guī)方法調(diào)用時,你需要創(chuàng)建一個包含待調(diào)用方法的對象,然后調(diào)用該方法,并傳遞它需要的參數(shù)。其中,指定要調(diào)用哪個對象的哪個方法,和調(diào)用方法本身,是 “一下子”完成的。然而,通過委托來進行方法調(diào)用則不同,它將“方法調(diào)用的定義”和“方法的調(diào)用”區(qū)分開來。仔細觀察圖7-1,有一個delegate的實例,它封裝了調(diào)用方法所必須的方法信息。使用委托來調(diào)用方法包括三步:定義委托對象,創(chuàng)建委托實例,再調(diào)用委托實例。我們知道,委托本質(zhì)上是為“方法” 本身建立的對象,它和我們大部分代碼中的“方法”感覺上有很大不同。
-------上面內(nèi)容引自《應用框架的設計與實現(xiàn)》一書------------
注意啦,Delegate堂而皇之地作為“一等公民”在C#中“直接支持”,而Tapestry這樣的Java社區(qū)的著名項目又“轉(zhuǎn)而采用”,給個理由先?答案是:它提供的這種兩個對象之間的這種間接(indirection)關系,對平臺級軟件、以及auto wire特別重要的軟件,簡直太有用了。
你要是說采用“常規(guī)Listener方法”也“差不多”呀,我要問了:差不多是差多少?研讀研讀Tapestry本身吧!它同時采用了“常規(guī) Listener方法”和“基于Delegate的Listener方法”,你以為Howard這樣的架構師會是“靠拍腦袋來設計的人”嗎?!