Groovy探索之Builder 二
在前面的部分,我以
MarkupBuilder为例介绍了如何使用Builder,通过它,我们可以看过了DSL编程的威力。当然了,既然看到了Builder功能的强大,我们就忍不住想自己创建一个Builder,来构建我们自己的DSL编程。
在Groovy语言中,我们有
BuilderSupport来帮助我们创建我们自己的Builder,
BuilderSupport为我们对创建Builder作了很大的简化。继承了
BuilderSupport类以后,我们要实现如下的方法:
protected
void
setParent(Object parent,Object child)
protected
Object createNode(Object name)
protected
Object createNode(Object name,Object value)
protected
Object createNode(Object name,Map attributes)
protected
Object createNode(Object name,Map attributes,Object value)
protected
void
nodeCompleted(Object parent,Object node)
class
TestBuilder
extends
BuilderSupport{
protected
void
setParent(Object parent,Object child){
}
protected
Object createNode(Object name){
println
'invoke createNode,input:'
+name
}
protected
Object createNode(Object name,Object value){
println
'invoke createNode,input-name: '
+name+
' value: '
+value
}
protected
Object createNode(Object name,Map attributes){
println
'invoke createNode,input-name: '
+name+
' attributes: '
+attributes
}
protected
Object createNode(Object name,input-name: '
+name+
' attributes: '
+attributes+
' value: '
+value
}
protected
void
nodeCompleted(Object parent,Object node) {
println
'invoke nodeCompleted'
}
}
下面,我们就来测试它。
def
builder =
new
TestBuilder()
builder.
test
()
invoke createNode,input:test
invoke nodeCompleted
可以看到,当我们的builder对象调用一个没有参数的方法的时候,它会调用“
createNode(Object name)”方法,在这个方法完成之后,再调用“
nodeCompleted(Object parent,Object node)”方法。
我们接着往下测:
def
builder =
new
TestBuilder()
builder.
test
'tom'
invoke createNode,input-name: test value: tom
invoke nodeCompleted
可以看到,当我们的builder对象调用一个带有参数的方法的时候,它会调用“
createNode(Object name,Object value)”方法,当然,在这个方法完成之后,再调用“
nodeCompleted(Object parent,Object node)”方法。
def
builder =
new
TestBuilder()
builder.
test
(type:
'a'
)
invoke createNode,input-name: test attributes: ["type":"a"]
invoke nodeCompleted
结果可以看到,当我们的builder对象调用一个带有Map类型参数的方法的时候,它会调用“
protected
Object createNode(Object name,Map attributes)”方法,当然,在这个方法完成之后,再调用“
nodeCompleted(Object parent,Object node)”方法。
最后,我们来完成最后一个测试:
def
builder =
new
TestBuilder()
builder.
test
(type:
'a'
,
'tom'
)
invoke createNode,input-name: test attributes: ["type":"a"]
invoke nodeCompleted
正像我们猜到的那样,当我们的builder对象调用一个带有Map类型参数和一个带有String类型参数的方法的时候,它会调用“
createNode(Object name,Object node)”方法。
注意:我在上面没有测试过“
setParent”方法,有兴趣的你,不妨测试看看,看看它到底有什么用?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。