Groovy探索之Delegate模式 二
发布时间:2020-12-14 16:59:18 所属栏目:大数据 来源:网络整理
导读:????????????????????????? Groovy 探索之 Delegate 模式 二 ? 鉴于Delegate模式在现在的编程中越来越重要,Groovy语言为它提供了一个帮助类来帮助我们创建委派类,这就是 DelegatingMetaClass 类。使用 DelegatingMetaClass 类,可以使得我们更加简单的实现
????????????????????????? Groovy
探索之Delegate模式 二
?
鉴于Delegate模式在现在的编程中越来越重要,Groovy语言为它提供了一个帮助类来帮助我们创建委派类,这就是
DelegatingMetaClass
类。使用
DelegatingMetaClass
类,可以使得我们更加简单的实现
Delegate
模式。下面就来看看
DelegatingMetaClass
类是如何帮助我们实现
Delegate
模式的。
还是接着上一篇的例子来说吧。我们已经有了一个Foo类,如下:
class
Foo {
???
???
def
test
()
??? {
??????
println
'have a test'
??? }
???
???
def
foo()
??? {
??????
println
'foo...'
??? }
?
?
?
}
现在,我们要在该类的基础上新增一个“
testAgain
”方法。我们使用“
DelegatingMetaClass
”类来实现这个功能,我们创建一个类来继承它,如下:
?
import
org.codehaus.groovy.runtime.InvokerHelper
?
class
FooDelegateingMetaClass
extends
groovy.lang.DelegatingMetaClass{
???
??? FooDelegateingMetaClass(
final
Class aclass)
??? {
???????
super
(aclass);
??????? initialize()
??? }
???
???
public
Object invokeMethod(Object a_object,String a_methodName,Object[] a_arguments)
??? {
??????
if
(a_methodName ==
'testAgain'
)
?????? {
??????????
println
'test again'
??????????
return
''
?????? }
??????
else
?????? {
???????
super
.invokeMethod(a_object,a_methodName,a_arguments)
?????? }
??? }
}
?
可以看到,这个类的实现非常的简单。一共只有两个方法:一个构造器,一个“
invokeMethod”方法。
构造器的实现都是一样的:一是把构造器的final Class对象传给父类(即“
DelegatingMetaClass”)构造器;接着调用初始化方法,即“
initialize”。
“
invokeMethod”方法的实现思想是把扩展的方法留给自己实现,把旧的方法交给父类对象实现,即完成了委派动作。
下面来测试我们刚刚生成的委派类:
??? ?
??? ?
def
myMetaClass =
new
FooDelegateingMetaClass(Foo.
class
)
?????
def
invoker = InvokerHelper.instance
????? invoker.metaRegistry.setMetaClass(Foo.
class
,myMetaClass)
?????
?????
def
foo =
new
Foo()
??? ?foo.
test
()
??? ?foo.foo()
?foo.testAgain()
?
“
FooDelegateingMetaClass”类的构造器参数是指动作(如“test”和“foo”)要委派到的目的类,在我们的例子中是“Foo”类。
而第三行“
invoker.metaRegistry.setMetaClass(Foo.
class
,myMetaClass)”则是指委派动作的类,在我们的例子中也是“Foo”类。
有关metaClass的一些知识,我们将单独提出来阐述,这里就不再说明。
运行上面的测试代码,可以得到如下的结果:
have a test
foo...
test again
?
上面演示了在运行期内给一个类扩展功能的方法。比如,我们想给
String
类增加“
testAgain
”,也可以使用上面的“
FooDelegateingMetaClass
”类,代码如下:
??? ?
def
myMetaClass =
new
FooDelegateingMetaClass(String.
class
)
?????
def
invoker = InvokerHelper.instance
????? invoker.metaRegistry.setMetaClass(String.
class
,myMetaClass)
?????
?????
def
str =
"ok"
??? ?str.testAgain()
?
println
str
?
运行结果为:
test again
ok
?
到了这里,你可能要问了,我有一个
Foo4
类,想继承
Foo
类的方法,能够使用上面的“
FooDelegateingMetaClass
”类吗?
比如有
Foo4
类如下:
?
class
Foo4 {
?
?
?
}
?
当然可以,我们只需要把“
invoker.metaRegistry.setMetaClass(Foo.
class
,myMetaClass)
”中的委派动作的类改为
Foo4
类即可,如下:
??? ?
def
myMetaClass =
new
FooDelegateingMetaClass(Foo.
class
)
?????
def
invoker = InvokerHelper.instance
????? invoker.metaRegistry.setMetaClass(Foo4.
class
,myMetaClass)
?????
?????
def
foo =
new
Foo4()
?????? foo.
test
()
?????? foo.foo()
??? foo.testAgain()
?
?
运行看看:
have a test
foo...
test again
?
可以看出,
DelegatingMetaClass
类可以将一系列有着相同委派目的的类的委派做了实实在在的简化,使得我们可以使用一个委派中间类,可以做完所有类的委派。在这里有一个实例,我们将在下一篇中谈到。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |