网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 核心技术 > 高级编程 > Groovy探索之Delegate模式  

Groovy探索之Delegate模式

2008-06-12  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

Delegate即是委派的意思。在Java语言中,很少提到委派或者委派模式,即使用到了也不说,这是因为Java语言的特点,实现起委派来相当的繁琐,而且只能适用于一些简单的场合。
    但现实的需求是,由于敏捷编程的兴起,重构技术也得到了大家的广泛使用;要使用重构,其中的一个重要原则是:使用组合代替聚合,这样才能方便重构。使用组合,最终是要使用到委派技术了。同时,我们经常有这样的一些需求,我们只想继承一个类的部分功能,而另外一部分功能是我们不想要、甚至是对我们有害的功能,这时候,我们只能使用委派技术,而不能使用继承了。
    基于上面的一些分析,我们知道,继承和委派技术都能扩展一个类,使它拥有另外一个类的部分或者全部功能。但委派技术更为灵活,它可以使得一个类可以全部或部分的扩展得到另一个类的功能,而继承只能是全盘接收。
    说了这么多,您可能要说了,我想看一些例子,或者你举出一些例子来证明你的观点啊。这正是下面要做的事。
    比方说,有下面的一个简单类:
    class Foo {

网管bitscn_com

        deftest()
        {
           println'have a test'
        } 网管联盟bitsCN_com

        def foo()
        {
           println'foo...'
        } 网管u家u.bitsCN.com

    } 网管论坛bbs_bitsCN_com

    现在有一个新的类要实现它的全部功能,即“test”和“foo”方法。当然,我们首先想到的是继承:
    class FooSon extends Foo{

网管u家u.bitscn@com

        def testAgain()
        {
           println'test it again'
        } 网管联盟bitsCN_com

    } 网管u家u.bitscn@com

    这样,我们就可以在FooSon中使用Foo的功能了,比如: 中国网管论坛bbs.bitsCN.com

         def foo = new FooSon() 中国网管论坛bbs.bitsCN.com

         foo.test()

网管论坛bbs_bitsCN_com

         foo.foo()

网管网www_bitscn_com

         foo.testAgain() 网管bitscn_com


    它的运行结果为:
    have a test
    foo...
    test it again 网管u家u.bitscn@com

    这样的继承无疑是完美的,子类不用写太多代码,就完全实现了父类的功能。但它最明显的缺点是,如果我有这样的需求,我只想在子类中要Foo类的“test”方法,不想要“foo”方法,在这里继承能办到吗?
    如果您的答案是否定的,请您跟着我往下看。
    下面,我将使用委派技术来产生一个新类,同样继承Foo类的所有方法:
    class Foo2 {

网管bitscn_com

        private delegate = new Foo() 中国网管论坛bbs.bitsCN.com

        deftest()
        {
           this.delegate.test()
        }
        def foo()
        {
           this.delegate.foo()
        } 中国网管联盟bitsCN.com

        def testAgain()
        {
           println'test it again'
        }
    } 网管网www_bitscn_com


    通过这个例子,您可以看到,所谓“委派”的意思是:一个类要实现的功能,比如Foo2类要实现的“test”和“foo”方法,但它并未真正去实现这些功能,而是把这些功能委派给另一个类去实现,如Foo2类的“test”和“foo”方法,实际上是交给Foo类去实现了。
    可以测试一下上面的例子:

网管联盟bitsCN@com

         def foo = new Foo2() 网管联盟bitsCN@com

         foo.test()
         foo.foo()
     foo.testAgain() 网管网www_bitscn_com

    运行结果为:
    have a test
    foo...
    test it again 中国网管联盟bitsCN.com

    当然,我还记得上面提出来的需求,新的类只想实现Foo类的“test”方法,不想要“foo”方法。使用委派技术就很好实现了:
    class Foo2 {

网管论坛bbs_bitsCN_com

        private delegate = new Foo()

网管bitscn_com

        deftest()
        {
           this.delegate.test()
        }
        def testAgain()
        {
           println'test it again'
        }
    }

网管联盟bitsCN_com


    看了上面的例子,您可能会说,委派技术很简单,也很好理解,但就是实现起来太繁琐了,我要想在子类中实现父类的方法,非得在子类中把这些方法重写一遍不可,远远没有继承来得方便。是的,这就是在Java语言中很少提到委派技术的原因。
    但是,我们应该知道的是,Groovy语言是基于Java语言的,这使得它必定有超过Java语言之处,而对委派技术的动态实现正是Groovy语言动态的一个重要方面。下面,我将举出一个例子来实现上面的功能的动态委派技术。

网管u家u.bitsCN.com

    class Foo3 {

网管联盟bitsCN@com

        private delegate = new Foo()

中国网管联盟bitsCN.com

        def invokeMethod(String name,Object args)
        {
           this.delegate.invokeMethod(name,args)
        } 网管联盟bitsCN_com

        def testAgain()
        {
           println'test it again'
        } 网管u家u.bitscn@com

    } 网管下载dl.bitscn.com

    是了,我们又通过“invokeMethod”方法来实现动态委派技术,我已经记不清“invokeMethod”方法实现了我们的多少功能。
    一个“invokeMethod”方法,就不管你要实现父类的多少功能,统统通过这一个方法就能实现了。下面来测试一下: 网管论坛bbs_bitsCN_com

         def foo = new Foo3() 中国网管联盟bitsCN.com

         foo.test()
         foo.foo()
     foo.testAgain()

中国网管论坛bbs.bitsCN.com

    结果为:
    have a test
    foo...
    test it again

网管bitscn_com

    如果你在动态实现中,不想要父类的“foo”方法,也是可以实现的:
    class Foo3 {

中国网管论坛bbs.bitsCN.com

        private delegate = new Foo() 网管下载dl.bitscn.com

        def invokeMethod(String name,Object args)
        {
           if(name != 'foo')
           {
               this.delegate.invokeMethod(name,args)
           }
        }

网管论坛bbs_bitsCN_com

        def testAgain()
        {
           println'test it again'
        } 中国网管论坛bbs.bitsCN.com

    }

网管u家u.bitsCN.com


TAGs   模式   探索       实现   委派   一个   方法   功能   test   技术      
 上一篇:全面了解Java媒体架构JMF   下一篇:获取最大长度存在巅倒字符串的子串
Groovy探索之Delegate模式 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: