groovy探索之builder 二
在前面的部分,我以
markupbuilder為例介紹了如何使用builder,通過它,我們可以看過了dsl程式設計的威力。當然了,既然看到了builder功能的強大,我們就忍不住想自己建立乙個builder,來構建我們自己的dsl程式設計。
在groovy語言中,我們有
buildersupport來幫助我們建立我們自己的builder,
buildersupport為我們對建立builder作了很大的簡化。繼承了
buildersupport類以後,我們要實現如下的方法:
protectedvoidsetparent(object parent, object child)
protectedobject createnode(object name)
protectedobject createnode(object name, object value)
protectedobject createnode(object name, map attributes)
protectedobject createnode(object name, map attributes, object value)
protectedvoidnodecompleted(object parent, object node)
這些方法都是都是幹什麼用的呢?口說也無憑,我們就寫乙個例子,實際來看看這些方法到底是幹什麼用的。
classtestbuilderextendsbuildersupport
protectedobject createnode(object name)
protectedobject createnode(object name, object value)
protectedobject createnode(object name, map attributes)
protectedobject createnode(object name, map attributes, object value)
protectedvoidnodecompleted(object parent, object node)
} 上面的類是我們的乙個
test
類,每個方法都實現了在控制台列印自己的資訊,告訴我們在什麼時候呼叫了它,傳入的引數是什麼。
下面,我們就來測試它。
defbuilder =newtestbuilder()
builder.test()
首先,我們初始化了乙個testbuilder物件,然後來測試它。上面**的結果為:
invoke createnode,input:test
invoke nodecompleted
可以看到,當我們的builder物件呼叫乙個沒有引數的方法的時候,它會呼叫「
createnode(object name)」方法,在這個方法完成之後,再呼叫「
nodecompleted(object parent, object node)」方法。
我們接著往下測:
defbuilder =newtestbuilder()
builder.test'tom'
這次的test方法帶乙個引數「tom」,它的輸出結果為:
invoke createnode, input-name: test value: tom
invoke nodecompleted
可以看到,當我們的builder物件呼叫乙個帶有引數的方法的時候,它會呼叫「
createnode(object name, object value)」方法,當然,在這個方法完成之後,再呼叫「
nodecompleted(object parent, object node)」方法。
現在終於看到了上面兩個方法的不同,可能我們差不多也可以猜到其他方法的不同了。閒話少說,我們接著往下測:
defbuilder =newtestbuilder()
builder.test(type:
'a')
這次測試的是
test
帶有乙個
map型別的引數,它的結果又如何呢?我們來看看它的列印結果:
invoke createnode, input-name: test attributes: ["type":"a"]
invoke nodecompleted
結果可以看到,當我們的builder物件呼叫乙個帶有map型別引數的方法的時候,它會呼叫「protectedobject createnode(object name, map attributes)」方法,當然,在這個方法完成之後,再呼叫「
nodecompleted(object parent, object node)」方法。
最後,我們來完成最後乙個測試:
defbuilder =newtestbuilder()
builder.test(type:
'a',
'tom')
這次的測試,我們帶有兩者不型別的引數,乙個是
map型別引數,乙個是
string
型別引數。它的輸出結果是什麼呢?
invoke createnode, input-name: test attributes: ["type":"a"]
invoke nodecompleted
正像我們猜到的那樣,當我們的builder物件呼叫乙個帶有map型別引數和乙個帶有string型別引數的方法的時候,它會呼叫「
createnode(object name, map attributes, object value)」方法,當然,在這個方法完成之後,再呼叫「
nodecompleted(object parent, object node)」方法。
總結:builder物件是根據不同的引數來呼叫它的不同方法,但呼叫完每乙個方法之後,都會呼叫「
nodecompleted」方法。
注意:我在上面沒有測試過「
setparent」方法,有興趣的你,不妨測試看看,看看它到底有什麼用?
這一章節的內容到此結束,在下一章節,我們將建立乙個可以實際使用的builder例子,來具體看一看,在實際應用中,如何把我們這一章節的知識使用上的。
Groovy探索之責任鏈模式
groovy探索之責任鏈模式 責任鏈模式在現實中也有很多對應的例項。比方說,乙個公司有a,b,c,d四個專案組,各自相鄰。一天,乙個客戶打 進來,說我們某某專案出了點問題,請幫忙解決。是由a專案組的人接的,a專案組的人一聽,說這不是我們負責的專案,我們把它交給b專案組吧。b專案組的人一聽,也說,這也...
Groovy探索之運算子的過載 一
groovy探索之運算子的過載 一 運算子最常用的是算術運算子和關係運算子。groovy語言對這些常用的運算子的過載提供了很好的支援。比如過載加號的方法是 plus 我們只要在我們自己的類中實現了該方法,就能使用加號對物件進行相加運算。下面舉個例子。比如,我們有乙個類yuan,用來模擬我們的人民幣元...
Groovy探索之運算子的過載 二
groovy探索之運算子的過載 二 前一篇詳細的說了說算術運算子和關係運算子的過載,這篇要說說賦值運算子和取值運算子,即 運算子的過載。還是以前一篇的 yuan 類來作為例子。classyuan 有了上面的類的定義,我們就可以如下使用這個類 defy newyuan y.num 109 printl...