美文网首页Java 杂谈Java
java设计模式-代理模式(Proxy)

java设计模式-代理模式(Proxy)

作者: yiqiquhuxi | 来源:发表于2019-07-17 13:30 被阅读52次

    代理模式-属于结构性模式。

    代理模式:给某一对象提供一个代理对象,并持有被代理对象的引用。

    做个简单的比喻:
             1:想去旅游,我让旅游公司给我安排行程,他们给我购票,安排酒店,行程等等。这里的旅游公司就是个代理。
              2:我让黄牛拿着我的身份证,带我买票,黄牛就是我的代理。


    代理模式分为静态代理,动态代理

    静态代理:通过编写具体的代理类和持有被代理对象,来完成代理过程。
    动态代理:动态的生成我们的被代理对象。(动态代理包括:JDK1.6+动态代理,cglib动态代理


    今天以张三旅游购票为例,演示这个代理模式,张三出门旅游,需要去买票。但是时间忙不开,需要找代理公司帮忙买票,代理公司需要持有张三的证件,为张三买票。

    静态代理:

    抽象接口(旅游购票接口):

    旅游购票接口

    具体实现类(张三旅游购票):

    张三旅游购票

    代理类(持有张三对象,为张三购票做代理):

    代理类,可以再代理前后加上自己的逻辑

    测试类:

    测试类

    虽然实现了代理公司代理给张三买票。但是静态代理还是存在自己的缺陷的:

    1:如果被代理对象比较多(ZTravel),那么我们的代理类(TravelProxy)也相应增加。
    2:如果接口(Travel)做了修改,具体实现类和代理类都会被修改。


    为了解决静态代理的不足,我们相应的有了动态代理。代码如下:

    动态代理(JDK1.6+形式),学习动态代理,需要搞清楚反射机制,因为动态代理就是用的反射。

    抽象接口和具体实现类:

    接口和实现

    动态代理类:

    实现了Invocationhandler接口 测试类

    上图可以看出来,执行效果和静态代理一模一样,只是实现方式不一样。

    动态代理虽然解决了静态代理一些不足,但是也存在自己的缺点:

    1:Proxy.newInstance()进行实例化,必须要求是接口参数,而不是具体类。


    SpringAOP,其实用的就是我们的动态代理,在代码前后加上我们的代码逻辑,比如登录校验,日志等等。

    相关文章

      网友评论

        本文标题:java设计模式-代理模式(Proxy)

        本文链接:https://www.haomeiwen.com/subject/ugfqlctx.html