Groovy探索之Delegate模式 二
2008-07-03 07:50
357 查看
Groovy探索之Delegate模式 二
鉴于Delegate模式在现在的编程中越来越重要,Groovy语言为它提供了一个帮助类来帮助我们创建委派类,这就是DelegatingMetaClass类。使用DelegatingMetaClass类,可以使得我们更加简单的实现Delegate模式。下面就来看看DelegatingMetaClass类是如何帮助我们实现Delegate模式的。
还是接着上一篇的例子来说吧。我们已经有了一个Foo类,如下:
class Foo {
deftest()
{
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类可以将一系列有着相同委派目的的类的委派做了实实在在的简化,使得我们可以使用一个委派中间类,可以做完所有类的委派。在这里有一个实例,我们将在下一篇中谈到。
鉴于Delegate模式在现在的编程中越来越重要,Groovy语言为它提供了一个帮助类来帮助我们创建委派类,这就是DelegatingMetaClass类。使用DelegatingMetaClass类,可以使得我们更加简单的实现Delegate模式。下面就来看看DelegatingMetaClass类是如何帮助我们实现Delegate模式的。
还是接着上一篇的例子来说吧。我们已经有了一个Foo类,如下:
class Foo {
deftest()
{
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类可以将一系列有着相同委派目的的类的委派做了实实在在的简化,使得我们可以使用一个委派中间类,可以做完所有类的委派。在这里有一个实例,我们将在下一篇中谈到。
相关文章推荐
- Groovy探索之Delegate模式 三
- Groovy探索之Delegate模式 一
- Groovy探索之Decorate模式
- Groovy探索 Visitor模式
- Groovy探索之delegate关键字 一(1)
- Groovy探索 自定义Range 二 自定义Range类与Decorate模式(上)
- Groovy探索之delegate关键字 一(2)
- Groovy探索 自定义Range 二 自定义Range类与Decorate模式(下)
- Groovy探索 关于“Load my Resource”模式的解读
- Groovy探索之闭包 七 使用闭包来实现模板方法模式
- Groovy探索之MOP 十六 使用Interceptor实现简单的观察家模式
- Groovy探索之Adapater模式
- 讲解delegate,notifucation,KVO三种模式实现通信的优缺点
- 设计模式探索——建造者模式
- AppCompatDelegate夜间模式
- 深入探索c++对象模型->1.1c++对象模式
- 探索Oracle11gR2 之 DataGuard_03 三种保护模式
- 探索 Java 同步机制(Monitor Object 并发模式在 Java 同步机制中的实现)
- 讲解delegate,notifucation,KVO三种模式实现通信的优缺点
- iOS设计模式——委托(delegate)