Groovy探索之Delegate模式 二

                          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 类可以将一系列有着相同委派目的的类的委派做了实实在在的简化,使得我们可以使用一个委派中间类,可以做完所有类的委派。在这里有一个实例,我们将在下一篇中谈到。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值