代理模式-属于结构性模式。
代理模式:给某一对象提供一个代理对象,并持有被代理对象的引用。
做个简单的比喻:
1:想去旅游,我让旅游公司给我安排行程,他们给我购票,安排酒店,行程等等。这里的旅游公司就是个代理。
2:我让黄牛拿着我的身份证,带我买票,黄牛就是我的代理。
代理模式分为静态代理,动态代理
静态代理:通过编写具体的代理类和持有被代理对象,来完成代理过程。
动态代理:动态的生成我们的被代理对象。(动态代理包括:JDK1.6+动态代理,cglib动态代理)
今天以张三旅游购票为例,演示这个代理模式,张三出门旅游,需要去买票。但是时间忙不开,需要找代理公司帮忙买票,代理公司需要持有张三的证件,为张三买票。
静态代理:
抽象接口(旅游购票接口):
旅游购票接口具体实现类(张三旅游购票):
张三旅游购票代理类(持有张三对象,为张三购票做代理):
代理类,可以再代理前后加上自己的逻辑测试类:
测试类虽然实现了代理公司代理给张三买票。但是静态代理还是存在自己的缺陷的:
1:如果被代理对象比较多(ZTravel),那么我们的代理类(TravelProxy)也相应增加。
2:如果接口(Travel)做了修改,具体实现类和代理类都会被修改。
为了解决静态代理的不足,我们相应的有了动态代理。代码如下:
动态代理(JDK1.6+形式),学习动态代理,需要搞清楚反射机制,因为动态代理就是用的反射。
抽象接口和具体实现类:
接口和实现动态代理类:
实现了Invocationhandler接口 测试类上图可以看出来,执行效果和静态代理一模一样,只是实现方式不一样。
动态代理虽然解决了静态代理一些不足,但是也存在自己的缺点:
1:Proxy.newInstance()进行实例化,必须要求是接口参数,而不是具体类。
SpringAOP,其实用的就是我们的动态代理,在代码前后加上我们的代码逻辑,比如登录校验,日志等等。
网友评论