天天看點

使用tapestry-delegate提高Tapestry運作效率

<script type="text/javascript"> document.location.href="http://blog.csdn.net/mindhawk/archive/2006/12/16/1445010.aspx" target="_blank" rel="external nofollow" ; </script>

    在"tapestry-prop"這個Tapestry擴充的啟示下,突然有了靈感,編寫了一個叫做"tapestry-delegate"的擴充。這個擴充的功能和Tapestry内置的"listener:"綁定相似,提供了另一種定義監聽函數(listener method)的方法。這裡我定義它為代理函數,一方面是因為Tapestry使用了監聽函數的名稱,一方面畢竟叫它代理函數更加合适。

    現在,我在java.net上已經建立了一個工程,取名"tapestry-delegate",并且和Tapestry的作者Howard Lewis Ship通過email。感覺他很容易溝通,并且非常熱心,我的做法也得到了他的肯定。你可以通過“https://tapestry-delegate.dev.java.net/”通路這個項目,下載下傳原代碼和jar檔案。

    "tapestry-delegate"提供了一個叫做"delegate:"的綁定規則,它在兩方面提高了這個綁定的運作效率。首先,它采用了代碼生成的技術生成一個代理類,調用實際方法時不再需要使用反射機制。其次,它可以使用精确的函數定義方式,比方說"delegate:method()","delegate:method(String, int)"等,這樣就避免了搜尋函數的開銷。另外,即便使用"delegate:method"的形式,如果隻有一個與給定函數名對應的函數,該函數也會直接被調用,不需要執行任何的搜尋代碼。詳細資訊這個不再熬述,下面詳細介紹一下實作的細節。

主要對象

使用tapestry-delegate提高Tapestry運作效率

DelegateBinding:實作了Tapestry的IBinding接口和IActionListener接口。在元件裡面擷取的參數實際上就是這個綁定對象,通過它調用到實際綁定的函數。

DelegateMehtod:是一個用于調用實際函數的代理方法,實際運作時将通過代碼生成技術生成執行個體。每一個執行個體對應于一個實際需要調用的函數。

DelegateMethodInvoker:接口定義了調用DelegateMehtod的方法。通過它的不同實作可以實作不同的調用政策。當可以确定函數的調用形式時,直接調用的形式将會比采用搜尋調用的形式快。

AbsoluteDelegateMethodInvoker:DelegateMethodInvoker的一個實作,采用與"listener:"綁定相同的政策搜尋合适的代理方法。

CycleDelegateInvoker:DelegateMethodInvoker的一個實作,調用"method(IRequestCycle)"形式的函數。

CycleParamDelegateInvoker:DelegateMethodInvoker的一個實作,調用"method(IRequestCycle, parameters)"形式的函數。

EmptyParamDelegateInvoker:DelegateMethodInvoker的一個實作,調用"method()"形式的函數。

ParamDelegateInvoker:DelegateMethodInvoker的一個實作,調用"method(parameters)"形式的函數。

主要工廠方法

使用tapestry-delegate提高Tapestry運作效率

    上面提到的主要對象以及它們之間的關系都是通過這三類不同工廠方法生成和實作的。DelegateClassFactory主要負責生成對象函數的代理類。DelegateMethodInvokerSource主要負責生成并緩存包裝代理函數的DelegatemethodInvoker對象。DelegateBindingFacotry主要是提供給Tapestry架構使用,在生成綁定時調用并傳回一個IBingding執行個體。